home *** CD-ROM | disk | FTP | other *** search
/ Network Supervisor's Toolkit / Network Supervisor's Toolkit.iso / novell / pds93a / pdsfeb93.txt next >
Text File  |  1996-07-10  |  98KB  |  2,637 lines

  1. **********************************************
  2. **********************************************
  3. Novell Professional Developer
  4. B  U  L  L  E  T  S
  5. **********************************************
  6. FEBRUARY 1993
  7. Volume 5 Number 2
  8. **********************************************
  9. **********************************************
  10.  
  11.  
  12.  
  13. **********************************************
  14. **********************************************
  15. MAD'S COLUMN
  16. **********************************************
  17. **********************************************
  18.  
  19. Hello and welcome to the February 1993 issue of Bullets!
  20.  
  21. A question of concern that I have heard lately pertains to
  22. the distinction between and the futures for the NetWare
  23. Client SDK and the NetWare C Interface SDKs (DOS, Windows,
  24. OS/2 and Macintosh). Currently, each of these products are
  25. available to members of the Professional Developers' Program.
  26.  
  27. The more mature NetWare C Interface SDKs are being combined,
  28. along with additional functionality for awaited NetWare 3.x
  29. "fconsole" services and NetWare 4.0 services, into the
  30. NetWare Client SDK. (Other OS libraries will be added in the
  31. next release of the NetWare Client SDK.)
  32.  
  33. The NetWare Client SDK is currently in its "Early" release
  34. stage and is not yet as complete as the existing NetWare C
  35. Interface SDKs. In anticipation of the NetWare Client SDK
  36. being upgraded from "Early" to "Evolving" in the SDK Grading
  37. System, our plan is to release it following the release of
  38. NetWare 4.0.
  39.  
  40. Novell is committed to producing an SDK with one common
  41. interface -one solution for all platforms. Accomplishing this
  42. goal means the gradual replacement of the NetWare C Interface
  43. SDKs' library sets. Support for these SDKs will be provided
  44. for one year once each product has been discontinued.
  45.  
  46. I hope this information assists you in purchasing and using
  47. these products.
  48.  
  49. Happy_Programming!
  50.  
  51. Mad Poarch
  52. Director
  53. Developer Support/Service
  54.  
  55.  
  56.  
  57. **********************************************
  58. **********************************************
  59. ARTICLES:
  60. Messaging Demystified:
  61. An Overview of NetWare MHS
  62. **********************************************
  63. **********************************************
  64.  
  65. As networks and organizations become more geographically
  66. distributed, there is an growing need to utilize store-and-
  67. forward technology. Known more commonly as "messaging,"
  68. store-and-forward technology yields many benefits including
  69. control of network traffic, reduced telephone costs, better
  70. interpersonal information flow, and more efficient use of
  71. computing resources. With these benefits, messaging presents
  72. an important form of client/server communication you should
  73. keep in mind when designing and developing applications. This
  74. article provides an introduction to the different
  75. applications messaging technology, discusses Novell messaging
  76. solutions, and describes the Novell API that developers can
  77. use to build messaging-based solutions.
  78.  
  79.  
  80. **********************************************
  81. Applications of Messaging Technology
  82. **********************************************
  83.  
  84. Many people think of messaging as electronic mail, but this
  85. is only one of many different applications of messaging
  86. technology. This misperception is due to the high visibility
  87. of this person-to-person form of store-and-forward
  88. technology. Messaging is actually the process of "deferred
  89. delivery" of any type of data or information between two or
  90. more cooperative end-points. After submission to the
  91. messaging system, the forwarded data or information is
  92. consumed by a person or a process at some point in the
  93. future. When received, the message might trigger the start of
  94. some automated process or it might simply update someone on
  95. important information. This deferred delivery can be used
  96. like any other form of interprocess communication where
  97. store-and-forward properties can be used to their advantage.
  98.  
  99. While direct communication links generally come to mind when
  100. designing a client/server application, many business
  101. solutions do not require on-line communications to complete a
  102. task. In many situations the completion of a task can occur
  103. within some reasonable time, which might be minutes, hours,
  104. or even up to a day or two later. In these situations,
  105. asynchronous processing can be triggered by using a store-
  106. and-forward messaging system to send a set of instructions
  107. from a client application to some messaging-aware service.
  108.  
  109.  
  110. Four Categories of Messaging
  111.  
  112. There are four categories of messaging solutions. These
  113. include:
  114.  
  115. *       Person-to-person
  116. *       Person-to-process
  117. *       Process-to-person
  118. *       Process-to-process
  119.  
  120. Person-to-person messaging involves the transmission of
  121. information between people. E-mail is the best example of
  122. this type of messaging in which the message content might be
  123. text and/or binary attachments that may have been generated
  124. by a word processor or spreadsheet.
  125.  
  126. With person-to-process messaging, a person submits a message
  127. to a process which might cause the process to perform some
  128. action. An electronic library from which a person can request
  129. library documents is an example of this form; when the
  130. library receives the request the document is returned.
  131.  
  132. With process-to-person messaging, a process sends a message
  133. to a person in an automated fashion. An example of this form
  134. of messaging might be a financial report system that creates
  135. a report at pre-defined intervals and sends a copy of the
  136. report to various people.
  137.  
  138. Process-to-process messaging is another form of interprocess
  139. communications (IPC) in which one process sends information
  140. or requests to another process. An example of this would be
  141. database synchronization from a central system to remote
  142. databases for data that does not require real-time-access.
  143. More specifcally, it might include the automatic transmission
  144. of sales data from remote sites to a central accounting
  145. system in order to tally daily sales worldwide.
  146.  
  147.  
  148. Architectural Model of a Messaging System
  149.  
  150. Another commonly misunderstood aspect of messaging is the
  151. architectural model of a messaging system. Figure 1 shows a
  152. simple layer diagram of a messaging system and the
  153. relationship of the components.
  154.  
  155. **********************************************
  156. FIGURE 1: Relationship of messaging system components
  157.  
  158. |--------------------------------------------|
  159. |                 Messaging                  |
  160. |                Application                 |
  161. |--------------------------------------------|
  162. |          Application Programming           |
  163. |              Interface (API)               |
  164. |--------------------------------------------|
  165. |             |               |              |
  166. |  Messaging  |   Routing     |  Management  |
  167. |  Directory  |   & Delivery  |              |
  168. |             |               |              |
  169. |--------------------------------------------|
  170.  
  171. END of FIGURE 1
  172. **********************************************
  173.  
  174.  
  175. At the top of the diagram is the messaging application. This
  176. level defines the message content and rules for submitting
  177. and processing the information exchanged through the
  178. underlying delivery system. Any process that does not require
  179. an immediate response can be defined according to a set of
  180. application-specific rules, and then be implemented on the
  181. underlying delivery system.
  182.  
  183. The application level gains access into the delivery system
  184. through a set of APIs. These APIs grant the application
  185. access to a variety of messaging services, including
  186. directory services and message routing/delivery. Recently,
  187. there has been some confusion between the distinction of a
  188. messaging API and the delivery system itself. Although it is
  189. subtle, the selection of the API does not always dictate
  190. which messaging service is used. In fact it is quite possible
  191. to support a number of APIs concurrently over a common
  192. delivery service providing the delivery system is robust and
  193. comprehensive. However, selecting an API that is closely
  194. associated with the underlying messaging system can result in
  195. more complete access to the underlying richness of the
  196. messaging service.
  197.  
  198. In the context of messaging, the directory is primarily a
  199. store of known addresses for potential message recipients and
  200. may contain routing information used by the messaging
  201. "engine" for message delivery. Typically applications use
  202. this directory store to select recipients' messaging
  203. addresses. One of the most important features of a directory
  204. is that synchronization of content is managed in an automated
  205. manner concurrently with normal message delivery. This
  206. ensures directory consistency, enhances reliability and
  207. robustness, and offers cleaner and less labor-intensive
  208. administration of multiple messaging servers. Non-automated
  209. synchronization or off-line synchronization results in system
  210. message downtime and added administrative overhead.
  211.  
  212. Message delivery and routing is the most important and
  213. ideally the most invisible service to the application level.
  214. Among its many tasks, the messaging system expands
  215. distribution lists, canonizes messages, determines
  216. appropriate routing, communicates with other messaging
  217. servers over asynchronous or network connections, delivers
  218. the messages, and generates delivery and non-delivery
  219. notifications.
  220.  
  221. If the delivery system is robust and reliable, the details at
  222. this level are transparent to the application (as they well
  223. should be). It is also important that the messaging system
  224. provide a thorough set of messaging semantics to support
  225. interoperability with any other messaging systems that might
  226. be in use. A weak implementation results in lost information
  227. during gateway translation.
  228.  
  229. The manageability, configurability, and robustness of this
  230. layer are also critical to facilitate application needs.
  231. Flexibility in configuring forwarding intervals, durations,
  232. etc., facilitate coarse deterministic behavior which might be
  233. a requirement for certain applications (e.g. one hour or less
  234. delivery required), and it also facilitates more efficient
  235. use of expensive links and CPU resources. As such, the
  236. management tools for the delivery system must be complete as
  237. well.
  238.  
  239.  
  240. **********************************************
  241. Novell Messaging Solutions
  242. **********************************************
  243.  
  244. Novell provides a family of messaging solutions that enable a
  245. variety of applications to leverage this technology. These
  246. solutions are based upon a core set of technology called
  247. NetWare Message Handling Service (MHS). NetWare MHS forms the
  248. delivery system for application use. In relation to the
  249. architectural model described earlier, NetWare MHS forms all
  250. of the services beneath the API, has a native API (discussed
  251. below) and can support alternate APIs. While there are over
  252. 150 commercially available products spanning e-mail, fax
  253. service, forms processing, scheduling/calendaring, and
  254. workflow, there are hundreds of corporate IS applications
  255. which are designed to use NetWare MHS for other business
  256. needs.
  257.  
  258. NetWare MHS solutions are tailored for the various
  259. environments which require messaging. NetWare Global MHS
  260. provides comprehensive messaging services that are highly
  261. integrated with the NetWare 3.x and 4.0 operating systems.
  262. This NLM-based solution has the advantage of enhanced
  263. management control for both centralized and decentralized
  264. organizations. Because NetWare Global MHS is well integrated
  265. with NetWare and is based upon the existing services included
  266. in NetWare, many of the administrative functions are
  267. inherited from existing management of current NetWare
  268. services.
  269.  
  270. Two of the key features of NetWare Global MHS are on-line
  271. directory synchronization and protocol module support.
  272. Directory synchronization allows a collection of cooperating
  273. messaging servers to synchronize their directories of
  274. "mailboxes" and message routes while the messaging system is
  275. up. This reduces administrative requirements and increases
  276. system reliability.
  277.  
  278. Add-on protocol modules allow NetWare Global MHS to cleanly
  279. integrate with other messaging technologies including SNADS,
  280. SMTP, and X.400 environments. Protocol module integration
  281. also enables directory synchronization between SNADS hosts
  282. and UNIX-based SMTP servers, and it allows messaging
  283. "tunneling" so that non-MHS-based backbones can transport MHS
  284. messages without multiple message translations (common to
  285. today's gateway solutions). The richness of messaging
  286. semantics also has resulted in connectivity to virtually
  287. every messaging system through third-party gateways.
  288.  
  289. For NetWare 2.x, NetWare Lite, and mobile DOS users, DOS-
  290. based NetWare MHS solutions offer message delivery that fully
  291. interoperates with NetWare Global MHS. NetWare MHS is also
  292. available as a "local delivery" solution
  293.  
  294. (NetWare Basic MHS) providing identical message submission
  295. and delivery services for a collection of mailboxes residing
  296. on a single volume.
  297.  
  298.  
  299. **********************************************
  300. Novell's Standard Message Format (SMF) API
  301. **********************************************
  302.  
  303. Messaging applications gain access to the NetWare MHS
  304. delivery system through a file-based API called Standard
  305. Message Format (SMF). While alternate messaging APIs such as
  306. VIM, MAPI, OCE and CMC can be supported over NetWare MHS, SMF
  307. is the native API to NetWare MHS. As a result, applications
  308. developed to this API will have full access to the
  309. functionality offered by the messaging system.
  310.  
  311. Because it is a file-based API, SMF has a number of important
  312. characteristics. Three key benefits include cross-platform
  313. support, code efficiency, and the ability to utilize
  314. messaging from any environment capable of creating a
  315. structured text file. SMF presents an identical API for use
  316. on DOS, Windows, OS/2, Macintosh, and UNIX. As the API
  317. evolves to include future functionality, new features are
  318. immediately available to all platforms without dependence on
  319. functionally. Since an application specific subset of SMF can
  320. be chosen, applications are not burdened with the additional
  321. overhead of unnecessary code that might otherwise be included
  322. via a library. Finally, development can occur from a variety
  323. of environments such as spreadsheet macros, batch files, UNIX
  324. script files, or any high level language.
  325.  
  326. SMF is a simple API, but it offers access to several very
  327. comprehensive optional services. Simple applications can send
  328. a message with as few as three text lines, or send any file
  329. attachment with as few as four text lines. At the other end
  330. of the spectrum, SMF enables sophisticated application and
  331. gateway development which can support advanced features such
  332. as:
  333.  
  334. *       Up to 64 attachments with file-type notification and
  335.         file date(s)
  336. *       Message importance indication
  337. *       Message sensitivity indication
  338. *       Unlimited recipients
  339. *       Message expiration indication
  340. *       Blind CC
  341. *       Message forwarding
  342. *       Efficient form transmission
  343. *       Return receipt notification on delivery and message read
  344.  
  345. The SMF API consists of a set of text verbs (headers) which
  346. are separated from parameters by a colon (:). The textual
  347. parameter content and number of parameters is dependent upon
  348. the header. There are over 50 standard headers defined in
  349. SMF, and SMF includes the ability to expand the verb-set
  350. through the use of "OEM" defined headers. The examples in
  351. Figure 2 show a simple person-to-person text message and a
  352. person-to-process attachment transmission.
  353.  
  354. **********************************************
  355. FIGURE 2: Example SMF messages
  356.  
  357.   Example A: Person-to-process messaging
  358.  
  359.     SMF-71
  360.     To: Documentation Library @ Marketing.California.Haley
  361.         Corporation
  362.     From: J P Herriman @ Marketing.New York.Haley Corporation
  363.     Subject: STORE AS: New Collateral
  364.     Attachment: brochure
  365.  
  366.   Example B: Person-to-person messaging
  367.  
  368.     SMF-71
  369.     To: J P Herriman @ Marketing.New York.Haley Corporation
  370.     From: S D Becker @ Sales.California.Haley Corporation
  371.     Subject: New Collateral Comments
  372.  
  373.     The new collateral you sent is very useful. These have
  374.     contributed to a 50% increase in sales just this month!
  375.  
  376.     Thanks!
  377.  
  378. END of FIGURE 2
  379. **********************************************
  380.  
  381. In example A, J. P. Herriman is sending a brochure as an
  382. attachment to a message. The brochure is being sent to a
  383. library service which uses "STORE AS:" in the subject line as
  384. a command to save the attachment in the library under the
  385. specified name. This is an example of person-to-process
  386. messaging. In person-to-person messaging example B, S. D.
  387. Becker is sending J. P. Herriman a simple e-mail message
  388. commenting on a sales success, after using the brochure from
  389. the library.
  390.  
  391. To develop an SMF-based application, only two tools are
  392. required. The SMF Programmer's Reference defines the syntax
  393. and use of the message headers and a NetWare MHS delivery
  394. system provides the test environment. No compilers, linkers,
  395. or libraries are necessary although sophisticated
  396. applications may find a high-level language useful. Simpler
  397. applications might only require batch file creation or
  398. application macro development.
  399.  
  400. Using the messaging system requires at least four key phases:
  401.  
  402. 1)      Message creation, when an SMF-formatted file is created
  403.  
  404. 2)      Message submission, when the SMF file and any
  405.         attachments are copied into a standard directory
  406.         structure which is accessible by the NetWare MHS server
  407.  
  408. 3)      Message delivery is transparent to the application when
  409.         NetWare MHS picks up the message from the directory and
  410.         forwards it on to the destination mailbox (a directory
  411.         that is associated with the specified messaging address)
  412.  
  413. 4)      Message receipt and processing, when the message and any
  414.         attachments are extracted from the recipient "mailbox"
  415.         directory structure.
  416.  
  417. In this example, an SMF formatted message is created. Its
  418. associated attachment is copied into the vol:\mhs
  419. \mail\parcel directory and then the SMF file is copied into
  420. the vol:\mhs \mail\parcel\snd directory. The NetWare MHS
  421. engine recognizes the presence of the files, parses the SMF
  422. file to determine proper routing, and forwards the message to
  423. another NetWare MHS engine. This engine determines that the
  424. recipient is for a local mailbox and delivers the attachment
  425. file to the vol:\mhs\mail\user\bharris\iparcel directory, and
  426. sends the SMF file to the vol:\mhs\mail\user\bharris\mhs
  427. directory.
  428.  
  429.  
  430. **********************************************
  431. For More Information
  432. **********************************************
  433.  
  434. This article provides a good introduction to messaging
  435. development using SMF to access NetWare MHS services. For
  436. more information, obtain a copy of the SMF v71 Programmer's
  437. Reference through Novell Literature Fulfillment by calling 1-
  438. 800-NETWARE and requesting part number 100-0001213-001.
  439. Registered Novell developers can also obtain the SMF v71
  440. Software Developer's Kit for MHS by contacting the Novell
  441. Professional Developers' Programsm at 1-800-NETWARE or 1-801-
  442. 429-5588.
  443.  
  444.  
  445.  
  446. **********************************************
  447. **********************************************
  448. ARTICLES:
  449. Writing 32-bit OS/2 Apps in the NetWare Environment
  450. **********************************************
  451. **********************************************
  452.  
  453. Novell's NetWare OS/2 Developer's Kit v2.0 and the NetWare
  454. Client SDK open up the world of NetWare to OS/2 application
  455. developers. These SDKs allow you to design and implement
  456. applications that are compatible with OS/2 v2.0, the 32-bit
  457. version of IBM's multitasking
  458. operating system. While 32-bit users appreciate the better
  459. performance and flexibility of OS/2 v2.0, application
  460. developers have a more complex task when adapting projects to
  461. this new version of the operating system.
  462.  
  463. One situation that requires special handling is when a
  464. development project involves the use of 16-bit APIs (like
  465. Novell's) in a 32-bit application. Such cases require special
  466. techniques like thunking to translate 32-bit addresses for
  467. variables, so they can be used inside 16-bit APIs.
  468.  
  469. The APIs provided with the NetWare Client SDK and the NetWare
  470. OS/2 Developer's Kit are 16-bit functions. This article
  471. presents several examples to outline the requirements for and
  472. limitations on using these 16-bit APIs in 32-bit OS/2 v2.0
  473. applications.
  474.  
  475.  
  476. **********************************************
  477. Overview and Definitions
  478. **********************************************
  479.  
  480. In the OS/2 environment, references to 16-bit versus 32-bit
  481. usually denote the number of bits used to store an address.
  482. 16-bit addresses follow the older Intel 8086 format, in that
  483. the addresses consist of two words (each 16 bits in length),
  484. a segment word, and an offset. Together, these components
  485. create a physical memory address for either a function call
  486. or data variable. This addressing method limits the largest
  487. address within any given segment to be less than 0xFFFF or
  488. 64K. The largest data object referenced by a 16-bit address
  489. must also be less than 64K in order to be addressed by one
  490. segment. 16-bit addressing is often referred to as "tiled"
  491. memory.
  492.  
  493. 32-bit applications overcome this limitation by using
  494. "linear" memory. A linear address is one 32-bit long word
  495. that maps directly to a memory location up to 4GB. 32-bit
  496. addressing requires the use of microprocessors with 32-bit
  497. registers, such as the Intel 80386 and 80486 chips. Faster
  498. processors and faster data access (because there is no need
  499. to translate tiled addresses) make 32-bit programming
  500. desirable.
  501.  
  502. OS/2 v2.0 anticipates the need for running 16-bit
  503. applications in 32-bit mode. It handles this situation
  504. through the use of Local Description Tiling (LDT), which maps
  505. the two different types of addresses in a manner that is
  506. transparent to the application as it is running.
  507.  
  508.  
  509. Requirements for Mixed-Address Programming
  510.  
  511. Successful mixed-address programming requires that all
  512. variables be translated before they are used by the
  513. addressing scheme in effect. This rule applies to both
  514. functions and data. From 32-bit OS/2 code, 16-bit function
  515. calls must be declared 16-bit using #pragma statements or
  516. special type declaratives. Further, if these 16-bit functions
  517. use pointers as formal parameters, these pointers must be
  518. converted to 16-bit addresses prior to making the function
  519. call.
  520.  
  521. In some cases, a compiler will create a pointer to a variable
  522. of a size corresponding to the default addressing scheme in
  523. effect; e.g., a 32-bit pointer will point to a 32-bit
  524. variable (unless specifically cast) and a 16-bit pointer will
  525. point to a variable type modified as 16-bit. In particular,
  526. automatic variables, which are allocated on the program
  527. stack, will be allocated by default as 32-bit because the
  528. stack is allocated with the code in one 32-bit section. A
  529. non-typed pointer to these variables will be a 32-bit
  530. address. Static or external variables may be 16-bit if mixed
  531. addressing has been enabled.
  532.  
  533.  
  534. Limitations of Mixed-Address Programming
  535.  
  536. One caveat of mixed-address programming is that you must be
  537. aware of the actual amount of storage referenced by any
  538. pointer that will be translated to a different address size.
  539. 32-bit pointers can reference large portions of memory, but
  540. when they are tiled onto 16-bit addresses, the pointers are
  541. reduced to a maximum usable storage size of 64K. The pointer
  542. will be properly aligned to the start of the segment, but
  543. data beyond 64K will be inaccessible to the APIs. If pointers
  544. referring to a data buffer larger than 64K are passed to the
  545. APIs, inconsistent results will occur.
  546.  
  547.  
  548. **********************************************
  549. Using 16-bit NetWare OS/2 Libraries
  550. **********************************************
  551.  
  552. Preparing your code for compiling is the most time-consuming
  553. part of using 16-bit libraries. Each external function call
  554. in a 16-bit library must be declared as such by thunking the
  555. external reference. If any pointers are passed as formal
  556. parameters to these functions, the pointers must also be
  557. thunked.
  558.  
  559. Each OS/2 compiler handles thunking differently. The net
  560. result is a macro translation or function call that will
  561. modify how the machine code addresses the reference. The
  562. examples provided in this article use IBM's C/SET2 Compiler.
  563.  
  564. (Ed. Note: At the time of this article, only the C/SET2
  565. compiler was available for testing. Other 32-bit compilers
  566. for OS/2 like the WATCOM C compiler and Borland's C++, are
  567. available. Results and examples for these compilers are
  568. available on CompuServe in Novell's NOVDEV forum.)
  569.  
  570.  
  571. Modifying the 16-bit APIs
  572.  
  573. In The Design of OS/2, authors Deitel and Kogan define a
  574. thunk as a "layer of procedures that takes 16-bit API
  575. requests, converts them into 32-bit requests, issues the
  576. requests, and then completes the API return condition with
  577. 16-bit semantics" (p. 97). Thunking is therefore the process
  578. of making a 16-bit API function like a 32-bit API. The
  579. examples in this article demonstrate how this conversion can
  580. be achieved from within the NetWare Client SDK and OS/2
  581. Developer's Kit v2.0 header files.
  582.  
  583. The CSET/2 compiler uses the _Seg16 type modifier to declare
  584. a 16-bit pointer. The _Seg16 type modifier may only be used
  585. on a pointer. To declare a 16-bit function, CSET/2 uses the
  586. _Far16 type modifier; the #pragma seg16 statement has the
  587. same effect by declaring a data object that can be accessed
  588. by 16- or 32-bit code.
  589.  
  590. The most efficient way to handle the function declaration
  591. change is to modify the header files to include the thunking
  592. information whenever the files are in use by a 32-bit
  593. compiler. Using a macro definition to trigger a conditional
  594. compile is a common method. The code in Figure 3 demonstrates
  595. the necessary modifications to implement this definition.
  596.  
  597. ***********************************************
  598. FIGURE 3: Header modifications to automatically include
  599. "thunking" information
  600.  
  601.   #ifndef IS32BIT
  602.     // we are not using 32-bit code, so undefine
  603.     // the thunking types to avoid compiler errors
  604.   #define _Seg16
  605.   #define _Far16
  606.     // define the default external function type
  607.   #define API extern WORD far pascal
  608.   #define DWAPI extern DWORD far pascal
  609.   #else
  610.     // 32-bit code is in effect, check the compiler type
  611.   #ifndef CSET2
  612.     // for now, we are only using the CSET compiler
  613.     // so undefine the types if another is being used
  614.   #define _Seg16
  615.   #define _Far16
  616.     // default linkage is just far pascal
  617.   #define API extern WORD far pascal
  618.   #define DWAPI extern DWORD far pascal
  619.   #else
  620.     // CSet/2 compiler already has _Seg16 and _Far16
  621.     // defined, leave them alone.
  622.     // default far linkage is 16-bit
  623.   #define API extern WORD _Far16 _Pascal
  624.   #define DWAPI extern DWORD _Far16 _Pascal
  625.   #endif
  626.   #endif
  627.  
  628. END of FIGURE 3
  629. ***********************************************
  630.  
  631. The method shown in Figure 3 requires that two macros be
  632. defined in order to activate the 16-bit thunking: IS32BIT and
  633. CSET2. The IS32BIT macro will signal that mixed address code
  634. is in effect. Inside this #ifdef statement, thunking
  635. definitions for several compilers may be included. The CSET2
  636. macro defines which compiler is in use. Since the thunking
  637. syntax may change from compiler to compiler, there must be a
  638. #if test to define the 16-bit types and function linkage.
  639.  
  640. This conditional code can be inserted in the first API header
  641. file to be included (NWCALLS.H or NWCALDEF.H). The code will
  642. define a macro API that expands into the external function
  643. linkage type for each API function call. The function
  644. declarations themselves must also be modified to be of return
  645. type API. For example:
  646.  
  647.         API NWRemoveJobFromQueue(
  648.            WORD connID, DWORD queueID,
  649.            WORD JobNum);
  650.  
  651. The _Seg16 and _Far16 keywords must also be defined. In the
  652. case of the CSET/2 compiler, these macros are left unchanged.
  653. However, if you are not using a 32-bit compiler, or if the
  654. compiler syntax differs from that of IBM's CSET/2 compiler,
  655. these keywords must be changed to match the thunking
  656. semantics for the other compiler.
  657.  
  658. In addition to handling the 16-bit linkage, the API headers
  659. must also be modified to declare any pointers passed as
  660. formal parameters to be 16-bit pointers. This can also be
  661. done with the _Seg16 keyword, as shown below:
  662.  
  663.         API NWCreateQueueFile(WORD connID,
  664.            DWORD queueID, QueueJobStruct far * _Seg16 job,
  665.            WORD far * _Seg16 fileHandle);
  666.  
  667. Notice that both the far and _Seg16 type modifiers are
  668. included. In 32-bit code, the far type modifier has no
  669. effect. With a 16-bit compiler, the _Seg16 type modifier is
  670. undefined. This situation is consistent with the goal of
  671. being able to share these header files between different
  672. compilers and target addressing schema.
  673.  
  674. To complete the thunking procedure, data structures which may
  675. be declared in the 32-bit code and passed either by value or
  676. reference to the APIs must be modified so that any pointer
  677. variables use the _Seg16 type modifier. This following
  678. structure, from the SPX services, provides an example of the
  679. changes you should make to the data structure definitions:
  680.  
  681.         typedef struct
  682.         {
  683.           VOID FAR  * _Seg16 fragAddress;
  684.           USHORT      fragSize;
  685.  
  686.         } SPXECBFrag;
  687.  
  688. Note that using the #pragma seg16 directive for the struct,
  689. as in:
  690.  
  691.         #pragma seg16(ECBfrag)
  692.         SPXECBFrag ECBfrag;
  693.  
  694. will declare the structure as a 16-bit data item, but will
  695. not modify the pointers within the structure.
  696.  
  697.  
  698. Calling 16-bit APIs
  699.  
  700. The modifications described above to the header files
  701. encompass the necessary changes to create thunks for each
  702. API. The use of these thunked APIs is not totally
  703. transparent, however. Certain precautions are required when
  704. using thunked APIs; in order to successfully use thunked
  705. APIs, the calling side must properly convert parameters and
  706. abide by the 64KB size restriction.
  707.  
  708. As mentioned before, parameters that are passed into 16-bit
  709. APIs must be of a type compatible with 16-bit addressing.
  710. Pointer variables must be 16-bit addresses; they can be
  711. explicitly declared as 16-bit addresses through the use of
  712. the _Seg16 modifier. If the pointer is created dynamically
  713. (i.e., through the "address of" symbol (&)), its address type
  714. will be equivalent to the model in effect. That is, if a
  715. pointer to a variable is created by using its address, the
  716. address size will reflect the model in effect when the
  717. variable is declared. If the variable is an automatic
  718. variable, its reference will be a 32-bit pointer, since the
  719. stack resides within a 32-bit function. An effective solution
  720. is to declare an automatic variable of type _Seg16 and assign
  721. it to the reference created through the use of the "address
  722. of" symbol (see Figure 4).
  723.  
  724. ***********************************************
  725. FIGURE 4: Automatic pointer thunk example
  726.  
  727. extern funct16(
  728.   WORD FAR * _Seg16 Point16);
  729.  
  730. funct32(void)
  731. {
  732.   WORD FAR * _Seg16 addr;
  733.   WORD theVariable;
  734.  
  735.     // instead of:
  736.   funct16(&theVariable);
  737.  
  738.     // use:
  739.   addr = &theVariable;
  740.   funct16(addr);
  741.  
  742.   ...
  743.  
  744. END of FIGURE 4
  745. ***********************************************
  746.  
  747. Alternatively, there may be a compiler switch that signals
  748. that mixed addressing is being used. With the CSET/2
  749. compiler, this switch is "/Gt+." When you use this switch,
  750. external and static variables are 16-bit, automatic variables
  751. are 32-bit. References to these variables via the "address
  752. of" operator are 16-bit pointers. You could then call the
  753. above function, as shown in Figure 5, which is somewhat
  754. simpler.
  755.  
  756. ***********************************************
  757. FIGURE 5: Static pointer thunk example
  758.  
  759. extern funct16(WORD FAR * _Seg16 Point16);
  760. WORD Var16;
  761.  
  762.   funct32(void)
  763.   {
  764.     funct16(&Var16);
  765.  
  766.   ...
  767.  
  768. END of FIGURE 5
  769. ***********************************************
  770.  
  771. This second approach may work better for the NetWare APIs,
  772. since there are a number of variables that are passed by
  773. reference which are also shared between most of the APIs
  774. (e.g., ConnectionID).
  775.  
  776. When writing mixed-address NetWare applications, pay
  777. attention to the data item size. In most cases, the compiler
  778. will correctly translate a huge data object to a 16-bit
  779. address, so that it begins at the start of a data segment and
  780. continues allocating across as many segments as required by
  781. its size.
  782.  
  783. However the APIs in the NetWare libraries make no provisions
  784. for crossing segment boundaries. Therefore, with buffers less
  785. than 64KB in size that are passed to NetWare APIs, only the
  786. first 64KB of data will be used.
  787.  
  788.  
  789. **********************************************
  790. Compiling Mixed-Address Applications
  791. **********************************************
  792.  
  793. The IBM CSET/2 compiler has several switches or #pragmas
  794. available which must be set to properly compile 32-bit code
  795. which references 16-bit APIs. These switches control stack
  796. options and sizes, structure allocation and dynamic memory
  797. handling with mixed addresses, as well as the default
  798. variable size switch already mentioned (/Gt+).
  799.  
  800.  
  801. Stacks
  802.  
  803. A stack option enables a 16-bit stack, as well as the default
  804. 32-bit stack. This 16-bit stack will be allocated statically
  805. at runtime for use with calls to 16-bit APIs. The correct
  806. syntax for creating a 16-bit stack is:
  807.  
  808.         #pragma stack16 <size>
  809.  
  810. where "<size>" is the value in bytes and must be between 512
  811. and 65532. The default size is 4K.
  812.  
  813.  
  814. Structures
  815.  
  816. Pay close attention to alignment within the structure.
  817. Structures in 32-bit models are aligned on double word
  818. boundaries, while 16-bit models align structures on word
  819. boundaries. The NetWare APIs expect structures to be aligned
  820. on byte boundaries. Once again, this requirement can usually
  821. be met with a compiler switch. IBM's CSET/2 compiler uses
  822. #pragma pack <size>, where the size is 1, 2 or 4. The#pragma
  823. statements remains in effect from when the statement is
  824. encountered during compilation until the next #pragma pack
  825. statement, or the end of the code unit. In order to have the
  826. structure similarly aligned for use with the NetWare APIs,
  827. include the statement,
  828.  
  829.         #pragma pack 1
  830.  
  831. early in the compilation cycle (for example, in the first
  832. NWCalls header file). Alternatively, you can use the "/Sp"
  833. compiler switch.
  834.  
  835.  
  836. Memory Allocation
  837.  
  838. If you allocate memory dynamically for buffers that you are
  839. going to pass to 16-bit APIs, make certain that the memory
  840. allocation routines create the buffers so that they will not
  841. cross segment boundaries. With the CSET/2 compiler, this
  842. option is again set with the "/Gt+" switch, which enables
  843. _tcalloc, _trealloc and _tfree for use in creating 16-bit
  844. compatible buffers.
  845.  
  846.  
  847. **********************************************
  848. Linking Mixed-Address Applications
  849. **********************************************
  850.  
  851. Overall, there are no specific requirements for linking
  852. mixed-addresses applications, once you have created the
  853. appropriate object code. Still, when selecting C libraries,
  854. pay attention to availability of necessary OS/2 APIs.
  855.  
  856. IPX/SPX Communication Services under OS/2 and its dependents
  857. (as well as Novell's implementations of NetBIOS and Named
  858. Pipes) make use of 16-bit semaphores. When linking these
  859. types of applications, the migration libraries which contain
  860. 16-bit semaphores should be used (i.e., OS2386.LIB which
  861. comes with IBM's CSET/2 compiler).
  862.  
  863.  
  864. **********************************************
  865. For More Information
  866. **********************************************
  867.  
  868. Following these guidelines, the NetWare OS/2 Developer's Kit
  869. and the NetWare Client SDK allow developers to create 32-bit
  870. OS/2 applications that can take full advantage of the
  871. features of the NetWare operating system. For more
  872. information on the procedures described in this article or to
  873. request a set of thunked header files, please contact the
  874. Developer Support Group at 1-800-NETWARE or 1-801-429-5588.
  875.  
  876. To purchase this SDK or any other Novell development tools,
  877. contact Novell Developer Relations at 1-800-NETWARE or 1-801-
  878. 429-5588.
  879.  
  880.  
  881.  
  882.  
  883. **********************************************
  884. **********************************************
  885. TECHNICAL INSIGHTS:
  886. New AIOCOMX.NLM Driver Available
  887. (Network C for NLMs v2.0 (d))
  888. **********************************************
  889. **********************************************
  890.  
  891. The December 1992 issue of Bullets reported that
  892. AIOWriteData() allows partial writes (Technical Insights,
  893. "AIOWriteData() Documentation Update"). This condition
  894. resulted from a problem with AIOCOMX.NLM, which has now been
  895. corrected. A new version of AIOCOMX.NLM is available that
  896. rejects partial writes and complies fully with the
  897. documentation. The new version can be downloaded from
  898. Novell's CompuServe forum NOVLIB (LIB 9, filename AIOX.ZIP).
  899.  
  900.  
  901.  
  902. **********************************************
  903. **********************************************
  904. TECHNICAL INSIGHTS:
  905. Outer Joins on Computed Fields
  906. (NetWare SQL v3.0)
  907. **********************************************
  908. **********************************************
  909.  
  910. When a CREATE VIEW statement is used to create a view with a
  911. computed field whose resulting type is an integer, that
  912. computed field is considered to be a four-byte integer. This
  913. is important when using this field as part of an outer (or
  914. null) join, since the data type and length of the join fields
  915. must match exactly for an outer join. For example, in the
  916. statement,
  917.  
  918.         CREATE VIEW Test (T1, T2)
  919.         AS SELECT F1, 100 FROM Tbl1
  920.  
  921. the field "T2" is a four-byte integer containing the value
  922. 100. Consequently, the statement,
  923.  
  924.         SELECT * FROM Test, Tbl2
  925.         WHERE Test.T2 = Tbl2.fld(+)
  926.  
  927. will only work if "Tbl2.fld" is a four-byte integer, and is
  928. also an index (or the first segment of an index) on table
  929. "Tbl2." Unless both of these conditions are met, NetWare SQL
  930. will return a status 220 (No Matching Index on Secondary
  931. Keys).
  932.  
  933. Currently, a problem associated with NetWare SQL v3.0b causes
  934. the above SELECT statement to return an status 875 (Only a
  935. right Outer Join Is Supported), even if "Tbl2.fld" is a four-
  936. byte integer and an index.
  937.  
  938. To alleviate this problem, create the view at the Relational
  939. Primitive level instead of using SQL statements. Use the
  940. xCompute function to specify the computed field, since the
  941. xCompute function has parameters that allow the application
  942. to specify both the type and size of the resulting field. In
  943. this case, the computed field can be created as either a two-
  944. or four-byte integer, whichever is needed for the outer join.
  945.  
  946.  
  947. **********************************************
  948. **********************************************
  949. TECHNICAL INSIGHTS:
  950. Using the T_MORE Flag with SPX Protocol
  951. (Network C for NLMs v2.0 (e))
  952. **********************************************
  953. **********************************************
  954.  
  955. When you call t_rcv(), one of the parameters passed is the
  956. size of the buffer that was passed. When this buffer is
  957. filled, t_rcv() returns. If the buffers for t_snd() and
  958. t_rcv() are exactly the same size, this is exactly how it
  959. should behave. In some cases, however , if t_rcv() has a
  960. larger buffer than t_snd(), one might expect t_rcv() to
  961. return after the first call to t_snd(), and not wait for the
  962. buffer to be filled by multiple t_snd() calls, but the actual
  963. behavior of the call depends on how the T_MORE flag.
  964.  
  965. The T_MORE flag determines how the t_rcv() returns. If you
  966. call t_snd() with the T_MORE flag clear, t_rcv() will return
  967. with only a portion of its buffer filled. If you set the
  968. T_MORE flag, t_rcv() will not return, and will wait for more
  969. of its buffer to be filled.
  970.  
  971.  
  972.  
  973. **********************************************
  974. **********************************************
  975. TECHNICAL INSIGHTS:
  976. Network C for NLMs Documentation Error
  977. (Network C for NLMs v2.0 (x))
  978. **********************************************
  979. **********************************************
  980.  
  981. The example program on Page 3-23 of the NLM Library Reference
  982. Volume 1 is incorrect. If executed as is, the custom data for
  983. the NLM, which is stored in the global variable,
  984. globalString, will be NULL. This problem results from an
  985. uninitialized global variable that is set to NULL before the
  986. program begins execution. The data is read into the
  987. globalString variable correctly, but this occurs before the
  988. uninitialized global variables have been set to NULL.
  989.  
  990. When creating the globalString global variable assign a value
  991. to the string. Doing so will prevent the string from being
  992. set to NULL before the program executes.
  993.  
  994.  
  995.  
  996. **********************************************
  997. **********************************************
  998. TECHNICAL INSIGHTS:
  999. Correct Usage of Btrieve Operation 42
  1000. (NetWare Btrieve (NLM) v6.0)
  1001. **********************************************
  1002. **********************************************
  1003.  
  1004. The new NetWare Btrieve v6.0 operation 42, used to place
  1005. Btrieve files into Continuous Operation mode (and return them
  1006. to normal mode), can only be called from an NLM application.
  1007. It cannot be called from a workstation application. If a
  1008. workstation attempts to perform a Btrieve operation 42,
  1009. NetWare Btrieve v6.0 returns a status 20 (Btrieve Not
  1010. Loaded). NetWare Btrieve v5.x will return a status 1 (Invalid
  1011. Operation).
  1012.  
  1013.  
  1014.  
  1015. **********************************************
  1016. **********************************************
  1017. TECHNICAL INSIGHTS:
  1018. NetWare System Calls Doumentation Update
  1019. (NetWare System Calls for DOS v1.2)
  1020. **********************************************
  1021. **********************************************
  1022.  
  1023. When a workstation calls VerifyNetworkSerialNumber(), if the
  1024. networkSerialNumber parameter does not match the network's
  1025. serial number, the calling workstation will lose its
  1026. connection to the network. Although the documentation does
  1027. not include this information, the function was intended to
  1028. work this way. The return values are only valid if the match
  1029. occurs and some other error causes a non-zero return code.
  1030.  
  1031. The Btrieve v6.0 Developer's Kit Supplement includes a sample
  1032. NLM application that demonstrates the proper usage of
  1033. operation 42. Both the C source code and the compiled NLM are
  1034. included.
  1035.  
  1036.  
  1037.  
  1038. **********************************************
  1039. **********************************************
  1040. TECHNICAL INSIGHTS:
  1041. Closing Temporary Socket in BeginDiagnostics()
  1042. (NetWare C Interface for DOS v1.2)
  1043. **********************************************
  1044. **********************************************
  1045.  
  1046. If you call BeginDiagnostics() multiple times, the 11th
  1047. attempt fails when searching for a target. This occurs
  1048. because BeginDiagnostics() does not close the temporary
  1049. socket.
  1050.  
  1051. To prevent failure of BeginDiagnostics(), modify the source
  1052. code for DIAG.C as shown in Figure 6, so that
  1053. IPXCloseSocket() is called when an error occurs.
  1054.  
  1055. **********************************************
  1056. FIGURE 6: Required modifications to DIAG.C
  1057.  
  1058. int BeginDiagnostics(destination, connectionID, componentList )
  1059. *
  1060. *
  1061.  /* first open a socket then init receive ECB's */
  1062.  tempSocket = (WORD)0x00;    /* let IPX pick socket number */
  1063.   ccode = IPXOpenSocket((BYTE)&tempSocket, 0);
  1064.  
  1065.   /* call to function */
  1066.   if( (ccode = GetRemoteSPXSocket(destination,componentList))
  1067. != 0 )
  1068.    Error = COULD_NOT_OPEN_SOCKET;
  1069.   else
  1070.   {
  1071.     for (i=0; i<RESPONSE_ECBS; i++)
  1072.     {
  1073. *
  1074. *
  1075.   if (Error == NO_ERRORS)
  1076.   {
  1077.   *
  1078.   *
  1079.     if (ccode == 0)
  1080.     {
  1081.     *
  1082.     *
  1083.     else
  1084.       Error = COULD_NOT_BEGIN_CONNECTION;
  1085.  /* Comment out or remove the following unnecessary lines. */
  1086.       if (Error != NO_ERRORS)
  1087.          IPXCloseSocket (thisECB.socketNumber);
  1088.     }
  1089.   else
  1090.    Error = COULD_NOT_OPEN_SOCKET;
  1091.  
  1092. /* Insert the following line to close the temporary socket */
  1093.   IPXCloseSocket (tempSocket);
  1094.  
  1095.   return (Error);
  1096.  
  1097. END of FIGURE 6
  1098. **********************************************
  1099.  
  1100.  
  1101.  
  1102. **********************************************
  1103. **********************************************
  1104. TECHNICAL INSIGHTS:
  1105. File in DOS Partition Fails to Truncate
  1106. (Network C for NLMs v2.0 (d))
  1107. **********************************************
  1108. **********************************************
  1109.  
  1110. Specifying a length that is shorter than the file length on a
  1111. call to DOSWrite() does not cause the file to truncate to the
  1112. new length. To illustrate, consider the following sequence of
  1113. events:
  1114.  
  1115. *       DOSOpen(), DOSRead(), DOSClose()
  1116. *       Data was modified
  1117. *       DOSOpen(), DOSWrite(), DOSClose()
  1118. *       Examination of file reveals no change in file length has
  1119.         occured
  1120.  
  1121. In this example, a file in the DOS partition of a NetWare
  1122. file server that contains five lines. The application NLM
  1123. reads the five lines and modifies the data to only have four
  1124. lines and writes it back out. Later, viewing the file again
  1125. indicates that the fifth line is still in the file.
  1126.  
  1127. The DOSWrite API writes data to a particular offset for a
  1128. particlar length. In order to "rewrite" a file, the second
  1129. DOSOpen() call listed in above example must be changed to
  1130. DOSCreate(). The NLM Reference, Volume 2 states that
  1131. DOSCreate() will truncate an existing file or create a file
  1132. if it does not exist. The call to DOSCreate() returns a file
  1133. handle that can be used on subsequent calls to DOSWrite()
  1134. and DOSClose().
  1135.  
  1136.  
  1137.  
  1138. **********************************************
  1139. **********************************************
  1140. TECHNICAL INSIGHTS:
  1141. Brequest v6.0 /L Option
  1142. (NetWare Btrieve (NLM) v6.00x)
  1143. **********************************************
  1144. **********************************************
  1145.  
  1146. In Brequest v6.0x, an new undocumented load option, /L,
  1147. allows you to load another instance of Brequest even if
  1148. Brequest is already loaded. This option is useful if you want
  1149. to run Windows applications utilizing the Btrieve requester
  1150. while running DOS VM applications that use Brequest.
  1151.  
  1152. To run Windows applications that use the Btrieve requester,
  1153. Brequest must be loaded before starting Windows. In order to
  1154. run DOS applications in Windows, Brequest must be loaded in
  1155. each DOS session. However, if Brequest is loaded outside of
  1156. Windows, it cannot be loaded again in a DOS session.
  1157.  
  1158. For Windows applications utilizing the Btrieve requester,
  1159. load Brequest outside of Windows. In each Windows DOS session
  1160. that will be running a Btrieve application, load Brequest
  1161. with the /L option. Doing so will load another instance of
  1162. Brequest that is only available to the DOS session. Doing so
  1163. provides the DOS session with its own copy of Brequest and
  1164. prevents the DOS session from using the instance of Brequest
  1165. that was loaded before Windows was started.
  1166.  
  1167.  
  1168.  
  1169. **********************************************
  1170. **********************************************
  1171. TECHNICAL INSIGHTS:
  1172. TTSTransactionStatus() Requires LongSwap()
  1173. (Network C for NLMs v2.0 (e))
  1174. **********************************************
  1175. **********************************************
  1176.  
  1177. When using TTSTransactionStatus() on a local server, CLib
  1178. does not long swap the transaction number. An incorrect
  1179. transaction number will result in one of two problems. Either
  1180. the TTSTransactionStatus() call will erroneously report that
  1181. the transaction has completed, or it will show that the
  1182. transaction has never completed.
  1183.  
  1184. With CLib v3.11(d) and earlier, when using the
  1185. TTSTransactionStatus() call on a local server, LongSwap() the
  1186. transaction number to avoid this situation.
  1187.  
  1188.  
  1189.  
  1190. **********************************************
  1191. **********************************************
  1192. TECHNICAL INSIGHTS:
  1193. NetWare SQL Updates & Indexed Fields
  1194. (NetWare SQL v3.00b)
  1195. **********************************************
  1196. **********************************************
  1197.  
  1198. If you send NetWare SQL an UPDATE SQL statement with a
  1199. restriction based on a field that is an index, only the first
  1200. record matching the restriction will be updated. For example,
  1201.  
  1202.         UPDATE Appointments SET
  1203.         Amount^Due = 0.00 WHERE ID > 0
  1204.  
  1205. will only update the first record having ID > 0, if ID is an
  1206. index in the "Appointments" table. No other records will be
  1207. updated.
  1208.  
  1209. This situation was introduced by the NetWare SQL December
  1210. patch release (v3.00b) and will be fixed in patch release
  1211. v3.00c. Currently, the only workaround is to use NetWare SQL
  1212. with the September patch release installed (v3.00a).
  1213.  
  1214.  
  1215.  
  1216. **********************************************
  1217. **********************************************
  1218. TECHNICAL INSIGHTS:
  1219. Mux Semaphores and SPX
  1220. (NetWare OS/2 Developer's Kit v2.0)
  1221. **********************************************
  1222. **********************************************
  1223.  
  1224. Under OS/2, if you issue a "wait" command on mux semaphores
  1225. with one of the semaphores in the mux list being the ECB
  1226. semaphore, the apparent result is that the ECB semaphore
  1227. never clears. Actually, the semaphore is cleared and reset by
  1228. SPX, but the application is never notified. This situation
  1229. results in the "wait" never returning if it is set to
  1230. "infinite."
  1231.  
  1232. The situation does not occur with event or mutex semaphores.
  1233. If you need to wait on more than one semaphore, create
  1234. multiple threads that individually block one each on each
  1235. semaphore.
  1236.  
  1237.  
  1238.  
  1239. **********************************************
  1240. **********************************************
  1241. TECHNICAL INSIGHTS:
  1242. File Level Access with Brequest v5.16 & v6.0
  1243. (NetWare Btrieve (NLM) v6.0)
  1244. **********************************************
  1245. **********************************************
  1246.  
  1247. With Brequest v5.16, users are allowed to write to a Btrieve
  1248. file if the user has "Write" access to the directory, even if
  1249. the user does not have "Write" access to the file.
  1250.  
  1251. This situation does not occur with Brequest v6.0, since
  1252. Brequest v6.0 uses file-level access rather than directory-
  1253. level access. If a user has "RWCEMFA" access to a directory
  1254. but only "RF" (read and file scan) access to a file, Brequest
  1255. v6.0 returns a status 94 (Permission Error) on the Open
  1256. operation.
  1257.  
  1258. "Supervisor" access to a directory works differently. If a
  1259. user has "Supervisor" access, any file can be opened
  1260. regardless of which requester is in use. "Supervisor" rights
  1261. override all inherited rights masks in subdirectories and
  1262. files.
  1263.  
  1264.  
  1265.  
  1266. **********************************************
  1267. **********************************************
  1268. TECHNICAL INSIGHTS:
  1269. Driver Load Order with LANSUP and OS/2 v2.0
  1270. (NetWare OS/2 Requester v2.0)
  1271. **********************************************
  1272. **********************************************
  1273.  
  1274. When using the OS/2 driver LANSUP (the Open DataLink
  1275. Interface that allows multiple protocols on an OS/2 machine
  1276. from IBM), the order in which the drivers are loaded is
  1277. different than if ODINSUP is used. If you load the drivers in
  1278. the wrong order, one of three situations will result:
  1279.  
  1280. *       The machine fails to load the operating system.
  1281. *       The machine successfully loads the operating system, but
  1282.         reports numerous driver errors.
  1283. *       The machine sucessfullly initializes (without errors),
  1284.         but no NetWare services are available because the wrong
  1285.         protocols have been bound to the NIC.
  1286.  
  1287. To avoid problems with LANSUP, load the drivers in CONFIG.SYS
  1288. in the order shown in Figure 7.
  1289.  
  1290. **********************************************
  1291. FIGURE 7: Correct driver load order when using LANSUP driver
  1292.  
  1293. device=lsl.sys
  1294. run=ddaemon.exe
  1295. DEVICE=LANSUP.SYS
  1296. device=ipx.sys
  1297. device=spx.sys
  1298. run=spdaemon.exe
  1299. device=nmpipe.sys
  1300. device=npserver.sys
  1301. run=npdaemon.exe
  1302. ...
  1303.  
  1304. END of FIGURE 7
  1305. **********************************************
  1306.  
  1307.  
  1308.  
  1309. **********************************************
  1310. **********************************************
  1311. TECHNICAL INSIGHTS:
  1312. Int 21 Function 3F Bug in NETX.EXE
  1313. (NetWare Shell (NETX.EXE) v3.31)
  1314. **********************************************
  1315. **********************************************
  1316.  
  1317. If a section of a file is locked with Int 21 function 5C00
  1318. and another workstation using that file tries to read from
  1319. the locked area, the call appears to succeed, even though it
  1320. should fail. The carry flag should be set and an error code
  1321. should be returned in the AX register. The error code (5, in
  1322. this case) is being returned, but the carry flag is not being
  1323. set, so the contents of the AX register are processed as the
  1324. number of bytes read rather than as an error code. In this
  1325. case, it is impossible to tell if an error has occurred.
  1326.  
  1327. This bug has been detected in v3.26 and v3.31 of NETX.EXE,
  1328. and may exist in others versions.
  1329.  
  1330.  
  1331.  
  1332. **********************************************
  1333. **********************************************
  1334. TECHNICAL INSIGHTS:
  1335. Continuous Operations and File Logging
  1336. (NetWare SQL v3.0)
  1337. **********************************************
  1338. **********************************************
  1339.  
  1340. File logging and backups can both be used to rebuild Btrieve
  1341. files after a system failure. However, file logging and
  1342. Continuous Operations mode should never be used
  1343. simultaneously.
  1344.  
  1345. Btrieve v6.0 Continuous Operations mode allows continuous
  1346. access to Btrieve files while the files are being backed up.
  1347. When a file is open in Continuous Operation mode, the log
  1348. file is still being updated. If you activate logging and
  1349. place the file in Continuous Operations mode, at some point
  1350. the file will no longer be synchronized with the log file.
  1351.  
  1352. To illustrate, consider the following sequence of events:
  1353.  
  1354. 1.      A Btrieve file is backed up
  1355. 2.      File logging is activated
  1356. 3.      The file is modified (update, delete, or insert
  1357.         operation)
  1358. 4.      The file is placed in Continuous Operations mode
  1359. 5.      The file is modified again
  1360. 6.      Backup completes and the file is removed from Continuous
  1361.         Operations mode
  1362.  
  1363. At this point, if a a backup was required, the backup from
  1364. step 4 would be restored. The backup would reflect all the
  1365. changes that were made in step 3. The log file, however,
  1366. would contain both the changes made in step 3 and step 5. If
  1367. you used the log file at a later date, you would be making
  1368. the same modifications to the file and such duplication could
  1369. result in errors.
  1370.  
  1371.  
  1372.  
  1373. **********************************************
  1374. **********************************************
  1375. TECHNICAL INSIGHTS:
  1376. ScrollScreenRegionUp() overwrites memory
  1377. (Network C for NLMs v2.0 (e))
  1378. **********************************************
  1379. **********************************************
  1380.  
  1381. ScrollScreenRegionUp() can overwrite memory if used on line
  1382. 0, with the title bar active.In other words,
  1383. ScrollScreenRegionUp(0,1) while you have the <ALT> key down
  1384. will cause this to occur. If you scroll more than one line,
  1385. the problem does not occur.
  1386.  
  1387. To prevent memory overwrites, either write spaces to line 0,
  1388. or always scroll more than one line.
  1389.  
  1390.  
  1391.  
  1392. **********************************************
  1393. **********************************************
  1394. TECHNICAL INSIGHTS:
  1395. XQL and .SHR Files
  1396. (XQL for DOS v2.11)
  1397. **********************************************
  1398. **********************************************
  1399.  
  1400. In the December 1992 issue of Bullets, "Handle Usage with
  1401. User Rights & XQL Load" described how XQL creates and
  1402. maintains a .SHR file. Another anomaly has been found
  1403. regarding this issue.
  1404.  
  1405. If XQL is patched so that it can be accessed from within
  1406. Windows, and then is loaded from the WINSTART.BAT file, XQL's
  1407. .SHR file is created in the user's current directory when
  1408. Windows is started. Later, if a user opens a DOS session and
  1409. tries to load XQL again from the same directory, one of two
  1410. situations will occur:
  1411.  
  1412. 1)      If DOS SHARE was loaded before Windows, a Sharing
  1413.         Violation Error will be returned and XQL will not load.
  1414.  
  1415. 2)      If DOS SHARE was not loaded, XQL will overwrite the .SHR
  1416.         file already present with a new .SHR file. Subsequently
  1417.         unloading XQL from this DOS session will cause this .SHR
  1418.         file to be deleted, leaving the XQL that was loaded by
  1419.         WINSTART.BAT without an .SHR file to use. This situation
  1420.         will eventually cause status 202 or 821 (Invalid Cursor
  1421.         ID) errors to be returned.
  1422.  
  1423. The previous situations occur only when the .SHR files are
  1424. created on a local drive. If the current working directory is
  1425. a NetWare drive, neither situation occurs; two .SHR files are
  1426. properly created and maintained in the same NetWare
  1427. directory.
  1428.  
  1429. If using a local drive, either load XQL inside the DOS
  1430. session from a different directory than the current working
  1431. directory from which Windows was started, or specify an /x:
  1432. parameter on the XQL load line pointing to a different
  1433. directory. For more information on the /x: parameter, consult
  1434. the December 1992 issue of Bullets.
  1435.  
  1436.  
  1437.  
  1438. **********************************************
  1439. **********************************************
  1440. TECHNICAL INSIGHTS:
  1441. Events Cannot Be Unregistered While In Progress
  1442. (Network C for NLMs v2.0)
  1443. **********************************************
  1444. **********************************************
  1445.  
  1446. When you register for an event "Down File Server", you
  1447. provide it with a report procedure and a "warn" procedure to
  1448. execute. If you attempt to call UnRegisterForEvent() for
  1449. "Down File Server" in either of these functions, it will fail
  1450. with a return code of (-1).
  1451.  
  1452. You cannot call UnRegisterForEvent() while the event is
  1453. occurring. In the case of the "Down File Server" event, it is
  1454. unnecessary to unregister the event if the file server is
  1455. going down.
  1456.  
  1457.  
  1458.  
  1459. **********************************************
  1460. **********************************************
  1461. TECHNICAL INSIGHTS:
  1462. min() & max() are Both Macros and Functions
  1463. (Network C for NLMs v2.0 (d))
  1464. **********************************************
  1465. **********************************************
  1466.  
  1467. The functions min() and max() are defined as macros in
  1468. STREAM.H, but are prototyped as functions in STDLIB.H. If
  1469. STREAM.H is included before STDLIB.H, the compiler attempts
  1470. to expand the prototype in STDLIB.H with the macro from
  1471. STREAM.H. This situation results in syntax errors in
  1472. STDLIB.H.
  1473.  
  1474. To avoid problems, either always include STREAM.H after
  1475. STDLIB.H, or modify STDLIB.H by replacing the prototypes with
  1476. copies of the macro definitions from STREAM.H.
  1477.  
  1478.  
  1479.  
  1480. **********************************************
  1481. **********************************************
  1482. TECHNICAL INSIGHTS:
  1483. NWSTRM.H Header File Redefines delay()
  1484. (Network C for NLMs v2.0)
  1485. **********************************************
  1486. **********************************************
  1487.  
  1488. NWSTRM.H redefines delay() to be streamdelay() which takes
  1489. ticks instead of milliseconds. Thus, a call to delay(55) will
  1490. not delay for one tick, but will delay for 55 ticks.
  1491.  
  1492. Currently, there is no "clean" workaround for this situation.
  1493. Until further notice, call delay() from a module that does
  1494. not include NWSTRM.H. Otherwise, you will need to modify the
  1495. header file.
  1496.  
  1497.  
  1498.  
  1499. **********************************************
  1500. **********************************************
  1501. TECHNICAL INSIGHTS:
  1502. Blank Users Cause Security Problems
  1503. (Xtrieve PLUS v4.1x)
  1504. **********************************************
  1505. **********************************************
  1506.  
  1507. Recent versions of Xtrieve PLUS do not support blank users;
  1508. if a blank user exists in the USER.DDF data dictionary file,
  1509. then whenever Xtrieve PLUS is loaded, a status 205 (Invalid
  1510. Password) will be returned.
  1511.  
  1512. This error message is returned when Xtrieve PLUS logs into a
  1513. set of .DDF files. Xtrieve PLUS first attempts an xLogin to
  1514. the dictionaries. If a status 209 (Invalid User) is returned,
  1515. Xtrieve PLUS attempts another xLogin, prompting for a
  1516. username and a password. If anything other than a status 209
  1517. is returned on the first xLogin call, Xtrieve PLUS will not
  1518. prompt the user for the username and password.
  1519.  
  1520. When Xtrieve PLUS attempts its first xLogin call, it always
  1521. passes a blank username and a blank password. Normally, this
  1522. would return status 209 on a dictionary with security
  1523. installed, but since there is actually a blank entry in the
  1524. USER.DDF file, a status 205 is returned instead. Since
  1525. Xtrieve PLUS does not trap for anything but a status 209 on
  1526. the xLogin, the status 205 would be relayed to the Xtrieve
  1527. PLUS user.
  1528.  
  1529. It is interesting to note that XQLI will prompt for a
  1530. username and password if security is installed on the data
  1531. dictionary files, without attempting an initial XQLLogin
  1532. call. XQLI will prompt the user for a password even if the
  1533. user name is blank. So, the status 205 will not occur when
  1534. logging in through XQLI, unless the password specified is
  1535. actually invalid.
  1536.  
  1537. To prevent the status 205, remove the blank user from
  1538. USER.DDF using BSIM.EXE, B.EXE, or any utility that provides
  1539. Btrieve or XQLP function calls. The .DDF files have Btrieve
  1540. owner names defined for them when security is installed. The
  1541. Btrieve owner name on the .DDF files is the same as the
  1542. Master password specified when security was installed. You
  1543. can check USER.DDF for a blank user by generating an ASCII
  1544. file with BUTIL -SAVE on key path 0. If there is a blank
  1545. user, then read and delete the record with the blank user
  1546. using a Btrieve or XQL utility.
  1547.  
  1548.  
  1549.  
  1550. **********************************************
  1551. **********************************************
  1552. TECHNICAL INSIGHTS:
  1553. NSD201 Interferes with NWTools
  1554. (NetWare OS/2 Requester v2.0)
  1555. **********************************************
  1556. **********************************************
  1557.  
  1558. NWTools script files (.NWS files) created with version 2.0a
  1559. of the OS/2 Requester will not run properly after the drivers
  1560. are updated with the OS/2 v2.0 requester patch file (NSD201).
  1561. Specific examples include not being able to attach to a
  1562. server with an .NWS file.
  1563.  
  1564. This situation is apparently caused by NWTOOLS.EXE and
  1565. NWTOOLS.DLL, which are included with NSD201. New script files
  1566. may also function incorrectly. To ensure that script files
  1567. work properly, save a backup of NWTOOLS.EXE and NWTOOLS.DLL
  1568. before installing NSD201. Otherwise, install the latest
  1569. version, NSD202, which is fully compatible with the files
  1570. mentioned above.
  1571.  
  1572.  
  1573.  
  1574. **********************************************
  1575. **********************************************
  1576. NIBBLES AND BITS
  1577. Fast Answers to common questions
  1578. **********************************************
  1579. **********************************************
  1580.  
  1581. **********************************************
  1582. Network C for NLMs
  1583.  
  1584. Q       When I try to retrieve the status for a Macintosh file
  1585.         in the root directory, the stat() function returns "0"
  1586.         rather than "1" for the st_originatingNameSpace field.
  1587.         What should I do?
  1588.  
  1589. A       If you need to obtain originating name space for a
  1590.         Macintosh file, use AFPDirectoryEntry() instead.
  1591. **********************************************
  1592.  
  1593.  
  1594. **********************************************
  1595. NetWare C Interface for DOS
  1596.  
  1597. Q       How can I get the System UP time for a NetWare v3.11
  1598.         server from a client application?
  1599.  
  1600. A       In the NetWare 3.x and 4.0 environments, you have to
  1601.         write an NLM to be placed in the AUTOEXEC.NCF file that
  1602.         reads the system time and writes it to a text file.
  1603.         Then, the client applcation must read this text file and
  1604.         the current system time on the fileserver and subtract
  1605.         the current time from the time that was recorded by the
  1606.         NLM.
  1607. **********************************************
  1608.  
  1609.  
  1610. **********************************************
  1611. NetWare C Interface for Windows
  1612.  
  1613. Q       No matter what structure size I specify in
  1614.         GetServerInformation() under Windows, it always returns
  1615.         128 bytes of data. What should I do?
  1616.  
  1617. A       Always allocate at least 128 bytes for the received
  1618.         statistics buffer to avoid overwriting memory.
  1619. **********************************************
  1620.  
  1621.  
  1622. **********************************************
  1623. NACS/NASI
  1624.  
  1625. Q       My NASI application has run fine under NACS/NASI v2.x,
  1626.         but seems to hang under NACS/NASI v3.x.
  1627.  
  1628. A       The reply buffer to the call Query Name Service
  1629.         (function 0x21) is 32 bytes long. The current
  1630.         documentation (Sept. 1988, Rev. 2.06) shows the reply
  1631.         buffer as 30 bytes. The extra two bytes are at the end
  1632.         of the reply buffer and have the following values:
  1633.  
  1634.            31: Port number located by query
  1635.            32: Port status:
  1636.                 0x00:Port Idle
  1637.                 0x01:Port Down (hardware fail)
  1638.                 0x02:Port Connected (no data transfer yet)
  1639.                 0x03:Port Suspended (on hold)
  1640.                 0x04:Port Busy (data being transfered)
  1641.  
  1642. Q       Under NACS/NASI v3.00, a call to Query Name Service
  1643.         (function 0x21) returns only those ports which are not
  1644.         connected. How can I retrieve all ports?
  1645.  
  1646. A       Download the PTF-359 patch file from CompuServe (NOVLIB,
  1647.         LIB 9). This patch will add the necessary functionality
  1648.         to the Query Name Service call. Then, when the Query
  1649.         Name Service is called, all ports will be returned and
  1650.         the 32nd byte of the Query Name Service reply buffer
  1651.         will indicate the port status:
  1652.  
  1653.             0x00:Port Idle
  1654.             0x01:Port Down (hardware failure)
  1655.             0x02:Port Connected (no data transfer yet)
  1656.             0x03:Port Suspended (on hold)
  1657.             0x04:Port Busy (data being transferred)
  1658. **********************************************
  1659.  
  1660.  
  1661. **********************************************
  1662. NetWare OS/2 Developer's Kit
  1663.  
  1664. Q       When I call PeekPipe() and ReadPipe() with a zero buffer
  1665.         length specified, the pipe is disconnected and error
  1666.         109, "Pipe Broken," is returned, even on a valid pipe.
  1667.         What should I do?
  1668.  
  1669. A       Specify that a buffer of at least one byte is used. In
  1670.         the case of the peek, doing so will not cause a problem,
  1671.         since the contents are left in the pipe anyway.
  1672. **********************************************
  1673.  
  1674.  
  1675. **********************************************
  1676. NetWare Btrieve
  1677.  
  1678. Q       What version of the Btrieve reques-ter should I use with
  1679.         BSERVER.VAP v5.15 on NetWare 2.2?
  1680.  
  1681. A       For all versions of NetWare Btrieve (VAP or NLM), you
  1682.         should have the latest Btrieve requester loaded at each
  1683.         workstation. The latest versions are:
  1684.  
  1685.         *       Btrieve Requester for DOS (BREQUEST.EXE) v6.00b
  1686.         *       Btrieve Requester for OS/2 (BTRCALLS.DLL) v6.00b
  1687.         *       Btrieve Requester for Windows (WBTRCALL.DLL) v6.00c
  1688. **********************************************
  1689.  
  1690.  
  1691. **********************************************
  1692. Windows
  1693.  
  1694. Q       How can I determine if a DOS application is running
  1695.         under Windows?
  1696.  
  1697. A       The assembly code in Figure 8 demonstrates an interrupt
  1698.         that determines if a DOS application is running under
  1699.         Windows v3.1.
  1700.  
  1701. **********************************************
  1702. FIGURE 8:       Determining if a DOS application is running under
  1703.                 Windows v3.1
  1704.  
  1705. mov     ax, 160ah     ;
  1706. int     2fh           ; Check if in Windows 3.1 DOS box
  1707. or      ax, ax        ;
  1708. jz      Windows31     ; Jump if Windows 3.1
  1709.  
  1710. END of FIGURE 8
  1711. **********************************************
  1712.  
  1713. This function call also will determine if Windows v3.1 is
  1714. running in 386 Enhanced Mode or Standard Mode. If the
  1715. function determines that Windows v3.1 is running, it sets CX
  1716. equal to two if Windows is running in Standard Mode. If
  1717. Windows is running in Enhanced mode, it sets CX equal to
  1718. three.
  1719. **********************************************
  1720.  
  1721.  
  1722.  
  1723. **********************************************
  1724. **********************************************
  1725. B R A I N S H A R E    1 9 9 3
  1726. March 22-26
  1727. Salt Lake City, Utah
  1728.  
  1729. A special supplement to
  1730. Novell Professional Developer B U L L E T S
  1731. **********************************************
  1732. **********************************************
  1733.  
  1734. BrainShare '93 is your chance to hook up with the leading
  1735. technical experts in the network computing industry. This
  1736. technical development conference brings together the
  1737. industry's top minds in development, integration and support
  1738. with the top technical minds at Novell for the most
  1739. informative, comprehensive event of its kind in the network
  1740. computing industry. More than 2,000 people attended
  1741. BrainShare '92, and BrainShare '93 promises to be bigger and
  1742. better than ever.
  1743.  
  1744.  
  1745. Who Should Attend
  1746.  
  1747. BrainShare '93 offers a valuable opportunity to anyone who
  1748. develops or supports network computing solutions. If you're a
  1749. software or hardware developer, member of a support staff,
  1750. systems integrator or consultant, Certified NetWare Engineer,
  1751. Certified NetWare Instructor, or company executive, you
  1752. shouldn't miss this gathering of network computing
  1753. professionals.
  1754.  
  1755.  
  1756. Technical Content
  1757.  
  1758. The conference features more than 235 technical breakout
  1759. sessions dealing with all phases of NetWare development,
  1760. integration and support. These sessions are presented by the
  1761. Novell architects and engineers who write and support
  1762. NetWare, so you get the information you need straight from
  1763. the experts. NetWare v4.0, the industry's first distributed
  1764. operating system for local area networks, will be a featured
  1765. topic.
  1766.  
  1767. Breakout sessions will be presented at BrainShare on the
  1768. following topics:
  1769.  
  1770.         Accessing host systems
  1771.         Building a secure and reliable network
  1772.         Certified NetWare Instructors
  1773.         Client application development
  1774.         Client-server development
  1775.         Communications
  1776.         Database technologies
  1777.         Directory Services
  1778.         Hardware support issues
  1779.         International issues
  1780.         Macintosh connectivity
  1781.         Messaging and E-mail
  1782.         The NetWare desktop
  1783.         NetWare hubs and routers
  1784.         NetWare Loadable Module development
  1785.         The NetWare operating system
  1786.         NetWare transports and protocols
  1787.         Network management
  1788.         New NetWare technologies
  1789.         Service and support
  1790.         Systems integration issues
  1791.         UNIX
  1792.         UnixWare
  1793.         Wide area networks
  1794.  
  1795. BrainShare '93 will be held on the University of Utah campus.
  1796. The conference will take over a majority of the campus,
  1797. utilizing 25 classrooms for the technical breakout sessions.
  1798. In response to requests from last year's conference
  1799. attendees, many of the sessions have been extended in length,
  1800. to allow for greater technical content. Technical breakout
  1801. sessions have also been extended into Friday afternoon,
  1802. giving you more access to the sessions.
  1803.  
  1804.  
  1805. BrainShare Scheduler Utility
  1806.  
  1807. With over 235 breakout sessions from which to choose,
  1808. scheduling your week could be a nightmare. To make scheduling
  1809. your week easier, BrainShare provides the BrainShare
  1810. Scheduler. This GUI utility, available for Windows v3.1 and
  1811. OS/2 v2.0, allows to interactively schedule the breakout
  1812. sessions you want to attend. With it you can access all
  1813. session abstracts, with cross referencing tools and filters
  1814. available.
  1815.  
  1816. The result of using the utility is a printed schedule. After
  1817. returning the printed schedule to the BrainShare registration
  1818. office, you will receive tickets to the sessions you have
  1819. selected. These tickets give you priority access to the
  1820. sessions. Attendees without tickets will not be allowed into
  1821. the classrooms until five minutes before the start of each
  1822. session. This insures that you get the technical information
  1823. you need and get the most from the BrainShare conference.
  1824.  
  1825.  
  1826. Keynotes
  1827.  
  1828. BrainShare '93 features outstanding industry luminaries.
  1829. Here's the lineup:
  1830.  
  1831. Monday          Bob Supnik      V.P. & Tech. Director of Engineering
  1832.                                 Digital Equipment Corporation
  1833.  
  1834. Tuesday         John Landry     Chief Tech. Officer & VP Development
  1835.                                 Lotus Development Corporation
  1836.  
  1837. Wednesday       Philippe Kahn   President & Chief Executive Officer
  1838.                                 Borland International, Inc.
  1839.  
  1840. Thursday        John Sculley    Chairman, CEO & Technology Officer
  1841.                                 Apple Computer, Inc.
  1842.  
  1843. Friday          John Edwards    Executive V.P. & General Manager,
  1844.                                 Desktop Systems Group, Novell, Inc.
  1845.  
  1846.                  Drew Major      Senior Scientist & Systems Architect
  1847.                                  Novell, Inc.
  1848.  
  1849.  
  1850. Friday's General Session
  1851.  
  1852. There are a few suprises in store for attendees at Friday's
  1853. general session. John Edwards will start the morning with a
  1854. strategic perspecitive on Novell and NetWare, especially as
  1855. they are affected by the USL announcement. Drew Major will
  1856. again be giving us his vision on the future of the NetWare
  1857. operating system.
  1858.  
  1859. The Management Q & A Panel is your best opportunity to get
  1860. direct feedback from Novell executives. At the conclusion of
  1861. the Management Q & A there will be several valuable prizes
  1862. awarded to attendees. Since you must be present to win, you
  1863. won't want to miss this opportunity.
  1864.  
  1865.  
  1866. NetWare 4.0
  1867.  
  1868. NetWare 4.0 will be a major topic of discussion at BrainShare
  1869. '93. As an added bonus, all attendees will receive a CD
  1870. containing NetWare 4.0. This limited-used version will give
  1871. you the head start you need in developing enterprise-wide
  1872. applications or learning to install and maintan this next
  1873. generation operating system.
  1874.  
  1875.  
  1876. Labs
  1877.  
  1878. BrainShare '93 retains many of the features of past Novell
  1879. technical conferences. The BrainShare Lab will again
  1880. demonstrate solutions to real customer problems, using the
  1881. latest NetWare technologies and products.
  1882.  
  1883. One of the most exciting new features of BrainShare '93 is
  1884. the addition of the Certified NetWare Engineer Professional
  1885. Association (CNEPA) Hands-On Lab. Hands-on sessions will
  1886. cover a variety of subjects, including:
  1887.  
  1888.         Advanced NetWare printing
  1889.         Tuning and optimization
  1890.         PC/UNIX connectivity
  1891.         NetWare SFT Level III
  1892.         Dial-in/dial-out connectivity
  1893.         Network support tools
  1894.         Analyzing the LAN using LANalyzer for Windows
  1895.         Multiple protocol routing
  1896.         NetWare 4.0
  1897.         UnixWare and NetWare
  1898.  
  1899. The labs are conducted by CNEs and run concurrently with the
  1900. breakout sessions. They allow you to experience many of the
  1901. technologies you will be learning about in the classroom.
  1902.  
  1903.  
  1904. Sponsor Hospitality Night
  1905.  
  1906. One of the most popular BrainShare events is Monday's Sponsor
  1907. Hospitality Night. This provides a forum for Novell's
  1908. industry partners to present technologies and products of
  1909. interest to you. Sponsor Hospitality Night is again split
  1910. between the Marriott and Red Lion Hotels. Confirmed sponsors
  1911. include:
  1912.  
  1913.         3Com
  1914.         Blue Lance
  1915.         Borland
  1916.         Digital Equipment
  1917.         Hewlett-Packard
  1918.         IBM
  1919.         Intel
  1920.         Lotus
  1921.         Micropolis
  1922.         Microsoft
  1923.         OURS
  1924.         SMC
  1925.         Storage Dimensions
  1926.         Thomas-Conrad
  1927.         Univel
  1928.         Wang
  1929.         WordPerfect
  1930.  
  1931.  
  1932. Save $300 on Registration Fees
  1933.  
  1934. Between now and March 20, the registration price for the
  1935. conference is $1,295. Registration at the door is $1,595.
  1936.  
  1937.  
  1938. $100 Discount
  1939.  
  1940. If you are a member of a Novell program such as the CNE, CNI
  1941. or Novell Professional Developers' Program, you receive a
  1942. $100 discount off the registration price, no matter when you
  1943. register.
  1944.  
  1945.  
  1946. Register Today!
  1947.  
  1948. Register by phone, fax or mail:
  1949.  
  1950. BrainShare '93                  Phone: 1-800-253-2819, code 104
  1951. 1395 N. Highway Dr.             or 1-314-827-5629
  1952. Fenton, MO 63099                Fax: 1-314-827-6858
  1953.  
  1954.  
  1955. BrainShare International
  1956.  
  1957. Novell is taking BrainShare on the road -make your plans now
  1958. for BrainShare Europe and BrainShare Japan.
  1959.  
  1960. BrainShare Europe '93   BrainShare Japan '93
  1961. May 12-14                               June 22-24
  1962. Nice, France                    Tokyo, Japan
  1963.  
  1964.  
  1965.  
  1966. **********************************************
  1967. **********************************************
  1968. CURRENT PATCHES FOR NOVELL DEVELOPMENT TOOLS
  1969. **********************************************
  1970. **********************************************
  1971.  
  1972. Many problems encountered by Novell developers can be
  1973. resolved by using the current drivers and applying the latest
  1974. patches. In many cases, proper patching can save you a call
  1975. to the Developer Support Group.
  1976.  
  1977.  
  1978. NetWire
  1979.  
  1980. The latest NetWare drivers, example code for NetWare API
  1981. development tools, OS/2 requester patches, and patches for
  1982. Novell's database products are available on Novell's NetWire
  1983. forum on CompuServe. Back issues of Bullets and developer
  1984. FYIs are also available (NOVLIB, library 11).
  1985.  
  1986. New information is first stored in NOVLIB library 1, and
  1987. moved to library 7 after a period of 30 days. If you do not
  1988. have access to CompuServe, request these files from Novell's
  1989. Developer Support Group at 1-800-NETWARE (1-800-638-9273) or
  1990. 1-801-429-5588.
  1991.  
  1992. When you call, be ready to provide a shipping address, disk
  1993. preference (5.25", 3.5", HD, or DD) and, if you prefer
  1994. overnight delivery, your company's Federal Express account
  1995. number. If you do not provide a Federal Express account
  1996. number, the patch disk will be sent to you via regular mail.
  1997.  
  1998.  
  1999. NOVDEV
  2000.  
  2001. Members of the Novell Professional Developers' Program can
  2002. obtain updated NetWare API SDK components from Novell's
  2003. NOVDEV forum on CompuServe. For more information on Novell
  2004. developer programs contact Novell at 1-800-NETWARE (1-800-
  2005. 638-9273) or 1-801-429-5588.
  2006.  
  2007.  
  2008. For a Complete List...
  2009.  
  2010. A document describing available patches and other files and
  2011. their location on CompuServe is available through Novell
  2012. Developer Relation's Automated Fax System (AFS). This system
  2013. can provide you other useful information as well.
  2014.  
  2015. To use the AFS, call 1-800-RED-WORD (1-800-733-9673) or 512-
  2016. 794-1796 from a touchtone phone. Then, choose the option for
  2017. the Automated Fax System, select the documents you wish to
  2018. receive, and supply your fax number (the fax number to which
  2019. you want the document(s) sent). Document #7805 describes the
  2020. patches. Document #1 lists all other documents available
  2021. through the Automated Fax System. Up to five documents can be
  2022. requested per call.
  2023.  
  2024.  
  2025.  
  2026. **********************************************
  2027. **********************************************
  2028. NOVELL DEVELOPER EDUCATION
  2029. **********************************************
  2030. **********************************************
  2031.  
  2032. Novell Developer Education offers several courses for
  2033. developers who use Novell's development & database tools,
  2034. including NetWare SQL, Btrieve, Xtrieve PLUS, and the NetWare
  2035. Client APIs.
  2036.  
  2037.  
  2038. 904:    Btrieve: An Overview
  2039.  
  2040. This new course provides a general overview of NetWare
  2041. Btrieve v6.x and its new features. It covers file structures,
  2042. indexing, data integrity, record and file locking, caching,
  2043. operating modes, segmented keys, backward compatibility and
  2044. utilities.
  2045.  
  2046.  
  2047. 905:    Programming with Btrieve
  2048.  
  2049. This course has been enhanced to cover all Btrieve operations
  2050. & environments. It provides a complete introduction to
  2051. Novell's server-based record manager. 50% of class time is
  2052. spent in programming workshops. Working knowledge of C,
  2053. BASIC, Pascal, or COBOL required. Prerequisite: 904: Btrieve:
  2054. An Overview
  2055.  
  2056.  
  2057. 907:    Xtrieve PLUS
  2058.  
  2059. This course has been updated to include new features
  2060. introduced with NetWare SQL v3.0. It teaches developers to
  2061. use Xtrieve PLUS as a Btrieve or NetWare SQL programming
  2062. utility. Trains users of Btrieve- or NetWare SQL-based
  2063. database applications to work effectively with this menu
  2064. driven utility.
  2065.  
  2066.  
  2067. 911:    NetWare Database Administrator
  2068.  
  2069. This new course gives a complete, hands-on look at installing
  2070. and configuring NetWare SQL and NetWare Btrieve. It covers
  2071. the basics of ANSI Standard Structured Query Language (SQL),
  2072. focusing on NetWare SQL and key database features like
  2073. security, referential integrity (RI), database design, data
  2074. normalization and performance.
  2075.  
  2076.  
  2077. 912:    Programming with NetWare SQL
  2078.  
  2079. This new course is designed for developers and experienced
  2080. network and database administrators who will be developing
  2081. NetWare SQL applications or enhancing existing Btrieve
  2082. applications with NetWare SQL. It provides an in-depth look
  2083. at the functionality of NetWare SQL and discusses optimizing
  2084. database systems for development of efficient applications
  2085. using Novell database tools.
  2086.  
  2087.  
  2088. 930:    Developing NetWare Loadable Modules (NLMs)
  2089.  
  2090. This course introduces C programmers to server-based
  2091. application development in the 32-bit NetWare 3.x
  2092. environment. It covers basic concepts for writing server-
  2093. based C applications that access the NetWare 3.x C library
  2094. (CLib). Requires working knowledge of the C language.
  2095.  
  2096.  
  2097. 940:    NetWare Programming: Basic Services
  2098.  
  2099. This new lab-oriented class (40 percent lab work) introduces
  2100. NetWare programming concepts. It covers topics such as
  2101. bindery services, file system services, print services, queue
  2102. management, connection and file-server services, and
  2103. accounting and synchronization services. This class requires
  2104. knowledge of the C programming language.
  2105.  
  2106.  
  2107. 945:    NetWare Programming: Protocol Support
  2108.  
  2109. This new class covers protocol support features. It also
  2110. discusses network programming concepts and techniques for
  2111. developing client-side applications, including Service
  2112. Advertising Protocol (SAP) IPX/SPX, diagnostics, NetBIOS,
  2113. TLI, and Named Pipes. This class requires strong knowledge of
  2114. the C programming language.
  2115.  
  2116.  
  2117. To obtain information on pricing, location, scheduling, &
  2118. course content for classes held in the US, call 1-800-233-
  2119. 3382, 1-801-429-5508 or 1-800-NETWARE. Customers outside of
  2120. the U.S. should call 1-801-429-5508. For information on
  2121. availability, location, and prices of classes outside of the
  2122. U.S., contact your local Novell office.
  2123.  
  2124.  
  2125.  
  2126. **********************************************
  2127. **********************************************
  2128. FUN AND FACTS
  2129. Developer Trivia
  2130. **********************************************
  2131. **********************************************
  2132.  
  2133. Test your developing skills with the development products by
  2134. taking our Fun & Facts quiz. (See the end of this section for
  2135. answers.)
  2136.  
  2137. 1.      With Btrieve 5.x, can you create a supplemental index at
  2138.         the same time you create the file?
  2139.         A.      Yes
  2140.         B.      No
  2141.  
  2142. 2.      What error message does OS/2 v1.3 return if you try to
  2143.         run Brequest in a Global DOS box?
  2144.         A.      Error: Sys2090
  2145.         B.      "The system has encountered an error and cannot
  2146.                 continue."
  2147.         C.      IpxOpenSocketFailed
  2148.  
  2149. 3.      What is the syntax for thunking in OS/2 when thunking
  2150.         pointers to 16 bit pointers?
  2151.         A.      _Seg16
  2152.         B.      (thunk)
  2153.         C.      (far16)
  2154.  
  2155. 4.      How large is an OS/2 SPX header?
  2156.         A.      36 bytes
  2157.         B.      42 bytes
  2158.         C.      43 bytes
  2159.  
  2160. 5.      Under DOS, SPX uses Event Service Routines (ESRs) to
  2161.         perform certain requests when interrupted. What does
  2162.         OS/2 use to fulfill these types of requests?
  2163.         A.      ESRs
  2164.         B.      semaphores
  2165.         C.      pipes
  2166.  
  2167. 6.      Xerox has assigned Novell a set of sockets to be used by
  2168.         NetWare. What is socket 456 used for?
  2169.         A.      Diagnostics
  2170.         B.      NetBIOS
  2171.         C.      Named Pipes
  2172.  
  2173. 7.      Currently, three data streams are defined for NetWare.
  2174.         What are they?
  2175.         A.      DOS, MAC, & OS/2
  2176.         B.      DOS, MAC, & UNIX (NFS)
  2177.         C.      DOS, MAC, & FTAM
  2178.  
  2179.  
  2180. **********************************************
  2181. FUN AND FACTS ANSWERS
  2182.  
  2183. 1.      B
  2184. 2.      C
  2185. 3.      A
  2186. 4.      B
  2187. 5.      B
  2188. 6.      A
  2189. 7.      C
  2190. **********************************************
  2191.  
  2192.  
  2193.  
  2194. **********************************************
  2195. **********************************************
  2196. CURRENTLY SUPPORTED VERSIONS OF NOVELL PRODUCTS
  2197. **********************************************
  2198. **********************************************
  2199.  
  2200. Communication Products
  2201.  
  2202.         NetWare for SAA                                 1.3
  2203.         NetWare 3270 LAN Workstation for DOS            2.0
  2204.         NetWare 3270 LAN Workstation for Macintosh      1.0
  2205.         NetWare 3270 LAN Workstation for Windows        1.1
  2206.         NetWare Access Server (NAS)                     1.2
  2207.         NetWare Asynchronous Communication
  2208.                 Services (NACS)                         3.0
  2209.  
  2210.  
  2211. Database Products
  2212.  
  2213.         NetWare Btrieve (NLM)                           5.15
  2214.         NetWare Btrieve (VAP)                           5.15
  2215.         NetWare SQL (NLM)                               3.00b
  2216.         NetWare SQL (VAP)                               2.11
  2217.  
  2218.         Report Executive for DOS                        4.11a
  2219.         Report Executive for OS/2                       4.11a
  2220.         Xtrieve PLUS for DOS                            4.11b
  2221.         Xtrieve PLUS for OS/2                           4.11b
  2222.  
  2223.  
  2224. Development Products
  2225.  
  2226.         Btrieve for DOS                                 5.10a
  2227.         Btrieve for OS/2                                5.10
  2228.         Btrieve for Windows                             5.10
  2229.         NetWare C Interface for DOS                     1.2
  2230.  
  2231.         NetWare RPC for DOS                             1.1
  2232.         NetWare RPC 386                                 1.1
  2233.         NetWare SQL Developer's Kit                     3.00a
  2234.         NetWare System Calls for DOS                    1.0
  2235.         NetWare System Interface
  2236.                 Technical Overview                      1.2
  2237.  
  2238.         Network C for DOS                               2.0
  2239.         XQL for DOS                                     2.11
  2240.         XQL for OS/2                                    2.11
  2241.  
  2242.  
  2243. Internetworking Products
  2244.  
  2245.         NetWare WAN Links                               2.0
  2246.         NetWare MultiProtocol Router                    2.0
  2247.  
  2248.  
  2249. NetWare Messaging
  2250.  
  2251.         NetWare Global Messaging                        1.0
  2252.         NetWare MHS Personal Ed.                        1.5p
  2253.         NetWare MHS 10-User                             1.5p
  2254.         NetWare MHS 50-User                             1.5b
  2255.         NetWare MHS Unlimited-Users                     1.5n
  2256.  
  2257.  
  2258. NetWare Operating System Products
  2259.  
  2260.         NetWare v3.11                                   3.11
  2261.         NetWare v2.2                                    2.2
  2262.         NetWare NFS                                     1.2
  2263.         NetWare Runtime
  2264.         NetWare FTAM                                    1.2
  2265.  
  2266.         NetWare for Macintosh (NLM)                     3.011
  2267.         NetWare Name Services
  2268.  
  2269.  
  2270. Network Management Products
  2271.  
  2272.         LANalyzer for Windows                           1.1
  2273.         NetWare Services Manager                        1.1
  2274.         LANalyzer Kit for Ethernet Networks             3.11a
  2275.         LANalyzer Kit for 4/16 Mbps
  2276.                 Token Ring Networks                     3.11a
  2277.         LANalyzer Kit for Ethernet & 4/16 Mbps
  2278.                 Token Ring Networks                     3.11a
  2279.  
  2280.  
  2281. Software Developer's Kits
  2282.  
  2283.         Btrieve v6.0 Developer's Kit Supplement         1.0
  2284.         LAN WorkPlace for DOS Toolkit                   4.1
  2285.         LAN WorkPlace for Macintosh Toolkit             1.3
  2286.         LAN WorkPlace for OS/2 Toolkit                  3.0
  2287.         MacIPX                                          1.0a5
  2288.  
  2289.         NASI: Programmer Reference Manual
  2290.         NetWare AppleTalk Interface for NLMs            1.1
  2291.         Network C for NLMs                              2.0 (e)
  2292.         NetWare C Interface for Macintosh               1.3
  2293.         NetWare C Interface for Windows                 1.3
  2294.  
  2295.         NetWare Client SDK                              1.0b
  2296.         NetWare for SAA LU6.2 Tools                     1.4
  2297.         NetWare Management System                       1.15
  2298.         NetWare Network Management Toolkit              1.0
  2299.         NetWare OS/2 Developer's Kit                    2.0
  2300.  
  2301.         NetWare SMF v71 Developer's Kit                 1.0
  2302.         NetWare 3270 Tools                              1.6
  2303.         NetWare TIRPC for DOS and NLMs                  1.0
  2304.         NLM SDK for NetWare v4.0                        1.0b
  2305.         Palm DOS SDK                                    1.0
  2306.  
  2307.  
  2308.  
  2309. **********************************************
  2310. **********************************************
  2311. REQUESTER VERSIONS
  2312. **********************************************
  2313. **********************************************
  2314.  
  2315.  
  2316. NetWare Shells and Requesters
  2317.  
  2318.         DOS Shell                                       3.31
  2319.         IPX (DOS)                                       3.31
  2320.         VIPX.386                                        1.14
  2321.         NetWare Requester for OS/2                      2.0
  2322.         NETWARE.DRV (Windows)                           2.0
  2323.         VNETWARE.386 (Windows)                          1.04
  2324.  
  2325.  
  2326. NetWare SQL                                         VAP     NLM
  2327.  
  2328.         Requester for DOS                           2.12a   3.00b
  2329.         Requester for OS/2                          2.11    3.00b
  2330.         Requester Interface for Windows 3.0         2.13    3.00b
  2331.  
  2332.  
  2333. NetWare Btrieve v5.15
  2334.  
  2335.         Requester for DOS                               6.0b
  2336.         Requester for OS/2                              6.0b
  2337.         Requester Interface for Windows 3.0             6.0c
  2338.  
  2339.  
  2340.  
  2341. **********************************************
  2342. **********************************************
  2343. CONTACTING NOVELL
  2344. **********************************************
  2345. **********************************************
  2346.  
  2347. To contact Developer Support, call 1-800-NETWARE
  2348. (1-800-638-9273), or 1-801-429-5588. Be prepared to
  2349. give the support operator your open incident
  2350. reference number. Developer Support questions may
  2351. also be sent by fax to 1-512-794-1775.
  2352.  
  2353. Many international distributors provide technical
  2354. support. Please contact your distributor or local
  2355. Novell office (see list at the end of this file)
  2356. for more information on international support
  2357. options.
  2358.  
  2359. Software patches may be obtained from Novell's
  2360. NetWire forum on CompuServe (NOVLIB, LIB 7), or by
  2361. contacting Developer Support and specifying the
  2362. patches you need by product name.
  2363.  
  2364. Novell database and development products can be
  2365. obtained through Novell Authorized Resellers, or by
  2366. calling 1-800-NETWARE (1-800-638-9273), or
  2367. 1-801-429-5588.
  2368.  
  2369. Software Developer's Kits (SDKs) are available only
  2370. through Novell's Professional Developers' Program.
  2371. Call 1-800-NETWARE (1-800-638-9273),
  2372. or 1-801-429-5588.
  2373.  
  2374. For more information on Novell Labs' development
  2375. tools, education classes and product certification,
  2376. call 1-800-453-1267 or 1-801-429-5544.
  2377.  
  2378. For more information on Novell education classes,
  2379. call 1-800-NETWARE (1-800-638-9273),
  2380. or 1-801-429-5588.
  2381.  
  2382.  
  2383.  
  2384. **********************************************
  2385. **********************************************
  2386. ACKNOWLEDGEMENTS
  2387. **********************************************
  2388. **********************************************
  2389.  
  2390. Publisher:         Mad Poarch
  2391.  
  2392. Editor:            Kirk R. Humphries
  2393.  
  2394. Design:            Creative Services, Provo
  2395.  
  2396. Feature Articles:  Ron Cully and Vicki L. Smith
  2397.  
  2398. Contributors:      Gaurang Amin, Linda Anderson, Neda Eslami,
  2399.                    John King, Nancy Kromar, Rudy McNeese,
  2400.                    Chris Ojeda, Matt Pinsonneault, Bill Prentice,
  2401.                    Bob Quinlan, Drue Reeves, Michael A. Spano,
  2402.                    Howard Thamm, Aslam Tejani, and Brenda Wallace
  2403.  
  2404. Bullets is a publication from Novell's Developer Support
  2405. Group. Special thanks to the Developer Support, Development,
  2406. Developer Relations, Product Marketing, and Marketing
  2407. Communications staff who contributed time and valuable input.
  2408.  
  2409. (c) 1993 Novell, Inc. All rights reserved.
  2410.  
  2411. **********************************************
  2412. (c) 1992 Novell, Inc. All rights reserved. Novell, the N
  2413. design, NetWare, Btrieve, XQL, LAN WorkPlace and LANalyzer
  2414. are registered trademarks; NetWare Loadable Module (NLM),
  2415. NetWare Global Messaging, NetWare System Calls for DOS,
  2416. NetWare Runtime, NetWare SQL, NetWare Btrieve, NetWare C
  2417. Interface for DOS, NetWare System Interface Technical
  2418. Overview, NetWare for SAA, NetWare RPC, NetWare RPC 386,
  2419. NetWare LU6.2, Report Executive, NetWare MHS, NetWare
  2420. Asynchronous Communication Services (NACS), NetWare
  2421. Management System, NetWare 3270 LAN Workstation, LANtern and
  2422. Xtrieve PLUS are trademarks; and NetWire and Professional
  2423. Developers' Program are service marks of Novell, Inc. IBM and
  2424. OS/2 are registered trademarks, and NetBIOS and SAA are
  2425. trademarks of International Business Machines Corporation.
  2426. Microsoft is a registered trademark, and Windows is a
  2427. trademark of Microsoft Corporation. Macintosh and AppleTalk
  2428. are registered trademarks of Apple Computer, Inc. CompuServe
  2429. is a registered trademark of CompuServe Corporation. NFS is a
  2430. registered trademark of Sun Microsystems, Inc.
  2431. **********************************************
  2432.  
  2433.  
  2434.  
  2435. **********************************************
  2436. **********************************************
  2437. NOVELL OFFICES
  2438. **********************************************
  2439. **********************************************
  2440.  
  2441. Novell, Inc.
  2442. Corporate Headquarters
  2443. 122 East 1700 South
  2444. Provo, Utah 84606-6194
  2445. USA
  2446. Tel.1 (801) 429-7000
  2447. FAX 1 (801) 429-3944
  2448.  
  2449. **********************************************
  2450.  
  2451. Novell Australia
  2452. Level 2
  2453. 2 Help Street
  2454. Chatswood NSW 2067
  2455. AUSTRALIA
  2456. Tel.61 (2) 413-3077
  2457. FAX 61 (2) 413-3116
  2458.  
  2459. **********************************************
  2460.  
  2461. Novell Benelux
  2462. Excelsiorlaan 13
  2463. 1930 Zaventem
  2464. BELGIUM
  2465. Tel.32 (2) 7250200
  2466. FAX 32 (2) 7250311
  2467.  
  2468. **********************************************
  2469.  
  2470. Novell Brazil
  2471. Av. Ribererao Preto 13012
  2472. Sa¢ Paulo
  2473. BRAZIL
  2474. Tel. 55 11 284 4866
  2475.  
  2476. **********************************************
  2477.  
  2478. Novell Canada
  2479. 3100 Steeles Avenue E.
  2480. Suite 500
  2481. Markham, ONT L3R 8T3
  2482. CANADA
  2483. Tel.(416) 940-2670
  2484.  
  2485. **********************************************
  2486.  
  2487. Novell France
  2488. Tour Anjou
  2489. 33, Quai De Dion-Bouton
  2490. 92814 Puteaux Cedex
  2491. FRANCE
  2492. Tel.33 (1) 4775-0909
  2493. FAX 33 (1) 4778-9472
  2494.  
  2495. **********************************************
  2496.  
  2497. Novell Germany
  2498. Willstètter Strasse 13
  2499. 4000 Dƒsseldorf 11
  2500. GERMANY
  2501. Tel.49 (211) 59730
  2502. FAX 49 (211) 5973250
  2503.  
  2504. **********************************************
  2505.  
  2506. Novell Hong Kong
  2507. China Resources Bldg.
  2508. 26 Harbour Rd. Room 4601-5
  2509. Wanchai
  2510. HONG KONG
  2511. Tel.852 8272223
  2512. FAX 852 8276555
  2513.  
  2514. **********************************************
  2515.  
  2516. Novell India
  2517. Onward Novell Software
  2518. Kriston House, 2nd Floor
  2519. Saki Vihar Rd., Chandivali
  2520. Andheri (E) Bombay 400 072
  2521. INDIA
  2522. Tel.41 (1) 750-0504
  2523. FAX 41 (1) 750-0957
  2524.  
  2525. **********************************************
  2526.  
  2527. Novell Italy
  2528. Via San Vittore 40
  2529. 20123 Milan
  2530. ITALY
  2531. Tel.39 2 4801-3554
  2532. FAX 39 2 4801-3594
  2533.  
  2534. **********************************************
  2535.  
  2536. Novell Japan
  2537. Toei Mishuku Bldg.3F
  2538. 1-13-1 Mishuku
  2539. Setagaya-ku, Tokyo 154
  2540. JAPAN
  2541. Tel.81 (3) 5481-1161
  2542. FAX 81 (3) 5481-1855
  2543.  
  2544. **********************************************
  2545.  
  2546. Novell Korea
  2547. Donghwa Building 13F-5
  2548. 25-5, Youido-dong
  2549. Youngdeungda-Ku
  2550. Seoul
  2551. KOREA
  2552. Tel.822 786 1141
  2553. FAX 822 786 1140
  2554.  
  2555. **********************************************
  2556.  
  2557. Novell Mexico
  2558. Insurgentes Sur
  2559. No. 1160 P.H.
  2560. Mexico D.F. 03100
  2561. MEXICO
  2562. Tel.52 (5) 575 5998/4192
  2563. FAX 52 (5) 559 0133
  2564.  
  2565. **********************************************
  2566.  
  2567. Novell Singapore
  2568. Level 36
  2569. Hong Leong Bldg.
  2570. 16 Raffles Quay
  2571. Singapore 0104
  2572. SINGAPORE
  2573. Tel.(65) 322-8503
  2574. FAX (65) 321-8966
  2575.  
  2576. **********************************************
  2577.  
  2578. Novell Spain
  2579. Paseo Castellana, 40bis
  2580. 28046 Madrid
  2581. SPAIN
  2582. Tel.34 (1) 577-4941
  2583. FAX 34 (1) 577-9053
  2584.  
  2585. **********************************************
  2586.  
  2587. Novell Sweden
  2588. Kottbyjatan 7
  2589. 16475 Kista
  2590. SWEDEN
  2591. Tel.46 (8) 703 2350
  2592. FAX 46 (8) 703 9434
  2593.  
  2594. **********************************************
  2595.  
  2596. Novell Switzerland
  2597. vor Ort 21
  2598. CH-8104 Weiningen-Zurich
  2599. SWITZERLAND
  2600. Tel.41 (1) 750-0504
  2601. FAX 41 (1) 750-0957
  2602.  
  2603. **********************************************
  2604.  
  2605. Novell Taiwan
  2606. 2F2 383 Jen Al Road
  2607. Section 4
  2608. Taipei
  2609. TAIWAN, R.O.C.
  2610. Tel.886 2775 3183
  2611. FAX 886 2731 2284
  2612.  
  2613. Novell United Kingdom
  2614. Avon House, Sweetwell Road
  2615. Bracknell, Berkshire
  2616. RG12 1HH
  2617. UNITED KINGDOM
  2618. Tel.44 (344) 860 400
  2619. FAX 44 (344) 860 353
  2620.  
  2621.  
  2622.  
  2623. **********************************************
  2624. **********************************************
  2625. Novell Professional Developer
  2626. B  U  L  L  E  T  S
  2627. **********************************************
  2628. FEBRUARY 1993
  2629. Volume 5 Number 2
  2630. **********************************************
  2631. **********************************************
  2632.  
  2633.  
  2634. END OF FILE
  2635. u▒fäJg(((╕⌐ft3A QΘ@5.æ╠5/    N¼√╩x"_`p0( (g░ifD`░im<JgHτ`└5(%(5<N¼≤"L▀0. °`0(((░l@4f ╕¼@,m╕¼@0mRA╨ⁿ ┤An <`
  2636. 3A x`p=@ ÷n ·@3B 3iFAε■≥r └ └Q╔ ·=i =i■≥=i■⌠=i
  2637.